perf 无法在非常大的进程上工作

perf 无法在非常大的进程上工作

我经常使用 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 - 但至少它有效。也许它也会对你有帮助。

相关内容