나는 내 애플리케이션을 프로파일링하기 위해 자주 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
적어도 작동했습니다. 아마도 그것은 당신에게도 도움이 될 것입니다.