perf는 매우 큰 프로세스에서는 작동하지 않습니다.

perf는 매우 큰 프로세스에서는 작동하지 않습니다.

나는 내 애플리케이션을 프로파일링하기 위해 자주 perf를 사용합니다. 나는 최근에 각각 ~750G RAM을 갖춘 몇 대의 새로운 컴퓨터를 구입했습니다. 나는 이들 중 하나에서 약 400G의 메모리를 사용하는 프로세스를 프로파일링하려고 합니다. 이것은 하나를 제외한 모든 새로운 컴퓨터에서 잘 작동합니다. 우분투를 실행하면서 모두 같은 방식으로 설치됩니다.

직접 perf설치 하고 컴파일해 보았습니다 .apt-get자식에서.

실행할 때 ./perf top -p 14182가끔 결과를 얻을 수 있지만(오랜 기다림 후, 아주 드물게) 대부분의 경우 다음과 같은 결과를 얻습니다.

The sys_perf_event_open() syscall returned with 3 (No such process) for event (cycles:pp).
/bin/dmesg may provide additional information.
No CONFIG_PERF_EVENTS=y kernel support configured?

동일한 PID(!)에 대해.

녹음하려고 할 때 비슷한 문제가 발생했습니다. 예를 들면 다음과 같습니다.

time ./perf record -F 111 -a -g -p 14182 -- sleep 3
Warning:
PID/TID switch overriding SYSTEMsleep: Terminated

Command exited with non-zero status 255
2.66user 91.58system 1:36.68elapsed 97%CPU (0avgtext+0avgdata 4896maxresident)k 
0inputs+5248outputs (0major+4847minor)pagefaults 0swaps

이 명령은 3초 이상 걸리며 Ctrl+C를 사용할 수 없으며 이를 종료하려면 가 필요합니다 -9. 일부 데이터를 내보내 perf.data지만 보려고 하면 file has no samples.

이 기계의 다른 (더 작은) 프로세스에서는 모든 것이 잘 실행되며, 앞에서 언급한 것처럼 무게가 약 200G인 프로세스의 경우 나머지 기계에서도 잘 실행됩니다. 다른 컴퓨터에서 이전 명령을 실행하면 CPU도 훨씬 적게 사용됩니다(97%가 아닌 33%).

나는 어디를 봐야 할지 몰랐고 Google은 나에게 별로 도움이 되지 않았습니다. 어떤 아이디어나 방향이 있나요?

편집하다

시스템이 얼마나 높은지 확인하기 위해 이것을 실행하여 strace -c얻은 결과는 다음과 같습니다.

처리 중량이 약 200G인 또 다른 기계:

_ strace  -c perf record -F 111 -a -g -p 27879 -- sleep 3 

Warning:
PID/TID switch overriding SYSTEM[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.684 MB perf.data (~29876 samples) ]
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 91.43    2.548664         109     23481           read
  2.47    0.068712          11      6457        15 stat
  2.42    0.067392           9      7303           write
  0.68    0.018960          12      1646           getdents
  0.68    0.018841          22       847         1 mmap

이 기계의 처리 중량은 ~400G입니다.

_ strace -c perf record -F 111 -a -g -p 14182 -- sleep 3                                                                                                                                                                                           /tmpvaknins9@snlp-brevis-3
Warning:
PID/TID switch overriding SYSTEMsleep: Terminated
sleep: Terminated
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.70  131.243199         472    278178           read
  0.16    0.207757           8     25895           write
  0.04    0.048962           8      6398         5 stat
  0.02    0.031247          14      2217           mmap
  0.02    0.026385           9      3091           close

읽는 데 시간이 많이 걸리는 것 같아요 /proc/tid/maps|status.. 혹시 제 과정이 너무 큰 건 아닐까요? 이 프로세스를 기록하도록 어떻게 얻을 수 있는지 단서가 있습니까?

감사해요!

답변1

저도 비슷한 일을 겪었지만 그렇게 심하지는 않았습니다.

CONFIG_PERF_EVENTS내 경우에는 약 10% 정도 오류가 발생합니다. 나머지 시간에는 perf record오류 없이 완료되지만 샘플을 기록하지 못합니다(출력 파일을 보면 perf report"파일에 샘플이 없습니다"라고 표시되고 perf report -D ... | grep -c RECORD_SAMPLE개수가 0임을 확인할 수 있습니다).

의 조언을 따르십시오.이 스택오버플로우 게시물, -e cpu-clock에 매개변수를 추가했습니다 perf record. 이로 인해 CONFIG_PERF_EVENTS 오류가 수정되지 않았고 perf record사양을 통과하는 한 여전히 2x-4x가 걸렸지만 sleep적어도 작동했습니다. 아마도 그것은 당신에게도 도움이 될 것입니다.

관련 정보