perf top의 출력이 완전히 혼란스러워요
저는 전체 CPU를 소비하는 sac2라는 C 프로그램을 실행하고 있습니다. 특히 1000억 바이트 이상의 배열을 반복하여 모든 바이트를 8비트 정수로 추가합니다.
기능적 관점에서 볼 때 이는 흥미로운 작업을 수행하지 않지만 다양한 단계에서 실행할 때 다양한 하드웨어 카운터를 수집하고 비교할 수 있습니다.
top을 실행하면 아래와 같이 CPU를 100% 사용하고 있다고 나옵니다.
top - 00:27:48 up 8 days, 10:10, 4 users, load average: 0.67, 0.49, 0.58
Tasks: 1881 total, 3 running, 1878 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.4 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 15828906+total, 79267468+free, 51445376 used, 73877056+buff/cache
KiB Swap: 4194300 total, 207800 free, 3986500 used. 97584883+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
197713 root 20 0 93.2g 20.9g 508 R 100.0 1.4 0:25.91 sac2
61859 root 20 0 3875820 748664 102052 S 3.3 0.0 10:40.92 perf
258330 root 20 0 103340 9024 1524 S 2.2 0.0 80:17.05 pmdalinux
194985 root 20 0 163968 4204 1608 R 2.0 0.0 0:10.48 top
7099 root 20 0 28504 4800 400 S 1.9 0.0 224:19.92 irqbalance
192315 pcp 20 0 125020 35180 2524 S 1.0 0.0 0:06.15 pmlogger
71102 root 20 0 150408 6092 1584 S 0.7 0.0 25:47.99 dstat
그러나 perf top에 따르면 오버헤드(CPU 사용률로 가정)는 약 40%에 불과합니다. 그렇다면 100%가 되어야 합니다.
Samples: 68M of event 'cycles:ppp', 4000 Hz, Event count (approx.): 85009918166 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
39.63% sac2 [.] main
9.18% [kernel] [k] mem_cgroup_charge_common
5.10% [kernel] [k] clear_page_c_e
3.43% [kernel] [k] retint_userspace_restore_args
3.00% [kernel] [k] sysret_check
또한 sac2가 완료되면 perf top은 sac2가 25초 동안 활성 상태임을 계속 표시하며 오버헤드는 꾸준히 감소합니다.
또 다른 문제는 perf-top 매뉴얼 페이지에 설명된 거의 모든 옵션이 무시된다는 것입니다.
전체 공개에 따르면 시스템에는 96개의 Skylake 코어, 192개의 스레드 및 1.5TB의 메모리가 있습니다. 테스트를 실행하면 머신에 나 혼자만 있습니다. 저는 루트로 실행 중이고 시스템은 Linux 커널 3.10이 설치된 Centos7을 실행하고 있습니다.
한 가지 가능성은 perf top이 3.10 커널에 많은 버그를 가지고 있다는 것입니다. 또 다른 가능성은 오버헤드가 무엇인지 이해하지 못한다는 것입니다. 그럼에도 불구하고 대부분의 옵션이 작동하지 않는다는 사실은 매우 수상합니다. 누구든지 도와줄 수 있나요?
답변1
또한 sac2가 완료되면 perf top은 sac2가 25초 동안 활성 상태임을 계속 표시하며 오버헤드는 꾸준히 감소합니다.
이는 시간 평균입니다. "관찰된 샘플의 비율"은 물론 관찰된 샘플의 수에 따라 달라집니다. 그래서 이것은 완전히 예상되었습니다!
특히 1000억 바이트 이상의 배열을 반복하여 모든 바이트를 8비트 정수로 추가합니다.
그럼 100GB RAM이 있나요? 그렇지 않으면 RAM의 일부를 페이지 아웃해야 합니다. 출력 귀하의 top
결과에 따르면 약 16GB의 메모리가 있는 것으로 나타났습니다!top
진술은 오해의 소지가 있으며 RAM이 1.5TB이므로 적합합니다!
perf top
또한 페이지를 가져와야 하는 횟수(예: 캐시 누락)도 계산해 보세요.많은당신의 경우에는. 이는 CPU 타이머에 포함되지 않을 가능성이 높습니다!
또한 perf top
없는 경우 -a
모든 코어를 샘플링하는 대신 단일 CPU 코어에 연결됩니다. sac2
보고 있는 동일한 코어에 프로세스를 고정 하지 않는 한 프로세스는 다른 곳에서 실행될 가능성이 높습니다.