我经常使用 perf 来分析我的应用程序。最近我买了几台新机器,每台都有~750G RAM。我正在尝试分析一个在其中一个上使用大约 400G 内存的进程。除了一台之外,这在所有新机器上都可以正常工作。它们的安装方式都是相同的,运行 ubuntu。
我尝试了perf
安装apt-get
并编译了我自己的来自 git。
运行时,./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 也少得多(33% 而不是 97%)。
我不知道还能去哪里寻找,谷歌对我来说也没有多大帮助。有什么想法或方向吗?
编辑
看到系统有多高,我用 运行了这个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
将确认计数为零)。
遵循中的建议这个 stackoverflow 帖子,我将-e cpu-clock
参数添加到perf record
.这并没有修复 CONFIG_PERF_EVENTS 错误,并且perf record
只要我通过指定,仍然需要 2x-4xsleep
- 但至少它有效。也许它也会对你有帮助。