16장. perf mem을 사용하여 메모리 액세스 프로파일링
perf mem 명령을 사용하여 시스템의 메모리 액세스를 샘플링할 수 있습니다. perf 툴의 mem 하위 명령을 사용하면 메모리 액세스(로드 및 저장소)를 샘플링할 수 있습니다. perf mem 명령은 메모리 대기 시간, 메모리 액세스 유형, 캐시 적중 및 누락을 유발하는 함수에 대한 정보를 제공하며 데이터 기호, 이러한 적중과 누락이 발생하는 메모리 위치를 기록합니다.
16.1. perf mem로 메모리 액세스 샘플링 링크 복사링크가 클립보드에 복사되었습니다!
perf mem 명령을 사용하여 시스템의 메모리 액세스를 샘플링할 수 있습니다. 명령은 perf 레코드 및 동일한 옵션과 perf 보고서와mem 하위 명령 전용 옵션도 사용합니다. 기록된 데이터는 나중에 분석할 수 있도록 현재 디렉토리의 perf.data 파일에 저장됩니다.
사전 요구 사항
-
perf사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
프로세스
메모리 액세스 샘플:
# perf mem record -a sleep <seconds>이 명령은
sleep명령에 지정된 대로 <seconds> 초 동안 모든 CPU의 메모리 액세스를 샘플링합니다. 메모리 액세스 데이터를 샘플링하려는 모든 명령에 대해sleep명령을 교체할 수 있습니다. 기본적으로perf mem은 메모리 로드와 저장소를 모두 샘플링합니다.-t옵션을 사용하고perf mem과레코드간에로드또는저장소를지정하여 하나의 메모리 작업만 선택할 수 있습니다. 로드의 경우 메모리 계층 수준, TLB 메모리 액세스, 버스 스누퍼 및 메모리 잠금에 대한 정보가 캡처됩니다.분석을 위해
perf.data파일을 엽니다.# perf mem report예제 명령을 사용한 경우 출력은 다음과 같습니다.
Available samples 35k cpu/mem-loads,ldlat=30/P 54k cpu/mem-stores/Pcpu/mem-loads,ldlat=30/P행은 메모리 로드를 통해 수집된 데이터를 나타내며cpu/mem-stores/P행은 메모리 저장소를 통해 수집된 데이터를 나타냅니다. 관심 있는 범주를 강조 표시하고 Enter 를 눌러 데이터를 확인합니다.Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 4067062 Overhead Samples Local Weight Memory access Symbol Shared Object Data Symbol Data Object Snoop TLB access Locked 0.07% 29 98 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 26 97 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 25 96 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.06% 1 2325 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e9084 [kernel.kallsyms] None L1 or L2 hit No 0.06% 1 2247 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e8164 [kernel.kallsyms] None L1 or L2 hit No 0.05% 1 2166 L1 or L1 hit [.] 0x00000000038140d6 libxul.so [.] 0x00007ffd7b84b4a8 [stack] None L1 or L2 hit No 0.05% 1 2117 Uncached or N/A hit [k] check_for_unclaimed_mmio [kernel.kallsyms] [k] 0xffffb092c1842300 [kernel.kallsyms] None L1 or L2 hit No 0.05% 22 95 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.05% 1 1898 L1 or L1 hit [.] 0x0000000002a30e07 libxul.so [.] 0x00007f610422e0e0 anon None L1 or L2 hit No 0.05% 1 1878 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e8164 [kernel.kallsyms] None L2 miss No 0.04% 18 94 L1 or L1 hit [.] 0x000000000000a255 libspeexdsp.so.1.5.0 [.] 0x00007f697a3cd0f0 anon None L1 or L2 hit No 0.04% 1 1593 Local RAM or RAM hit [.] 0x00000000026f907d libxul.so [.] 0x00007f3336d50a80 anon Hit L2 miss No 0.03% 1 1399 L1 or L1 hit [.] 0x00000000037cb5f1 libxul.so [.] 0x00007fbe81ef5d78 libxul.so None L1 or L2 hit No 0.03% 1 1229 LFB or LFB hit [.] 0x0000000002962aad libxul.so [.] 0x00007fb6f1be2b28 anon None L2 miss No 0.03% 1 1202 LFB or LFB hit [.] __pthread_mutex_lock libpthread-2.29.so [.] 0x00007fb75583ef20 anon None L1 or L2 hit No 0.03% 1 1193 Uncached or N/A hit [k] pci_azx_readl [kernel.kallsyms] [k] 0xffffb092c06e9164 [kernel.kallsyms] None L2 miss No 0.03% 1 1191 L1 or L1 hit [k] azx_get_delay_from_lpib [kernel.kallsyms] [k] 0xffffb092ca7efcf0 [kernel.kallsyms] None L1 or L2 hit No선택 사항: 결과를 정렬하여 데이터를 표시할 때 관심 있는 다양한 측면을 조사합니다. 예를 들어 샘플링 중에 발생하는 메모리 액세스 유형별로 메모리 로드를 초과하는 데이터를 내림차순으로 정렬하려면 해당 오버헤드의 내림차순으로 다음을 수행합니다.
# perf mem -t load report --sort=mem예를 들어 출력은 다음과 같습니다.
Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 40670 Overhead Samples Memory access 31.53% 9725 LFB or LFB hit 29.70% 12201 L1 or L1 hit 23.03% 9725 L3 or L3 hit 12.91% 2316 Local RAM or RAM hit 2.37% 743 L2 or L2 hit 0.34% 9 Uncached or N/A hit 0.10% 69 I/O or N/A hit 0.02% 825 L3 miss