如何摆脱性能中的“未知”部分

zhi*_*fan 4 c linux perf

我所做的是:

\n\n
1. sudo rm -rf /root/.debug/\n2. compile program with -g -O2 -fno-omit-frame-pointer\n3. run the program and get the pid\n4. sudo perf record -F 2000 -a -s -g -p $pid sleep 15\n5. sudo perf report\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我得到一小部分“未知”,就像

\n\n
-    2.50%     0.00%  postgres  [unknown]            [k] 0000000000000000                                                                                                                                  \n   - 0                                                                                                                                                                                                     \n        1.12% _int_malloc                                                                                                                                                                                  \xe2\x96\x92\n        0.79% _IO_vsnprintf\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来这是由于 libc \'malloc\' 调用造成的。然后我在同一台机器上编写一个程序来测试它。

\n\n
#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <sys/types.h>\n\nint main(int argc, char *argv[])\n{\n    while(1) {\n        printf("perf record -g -p %d -- sleep 5; perf report\\n", getpid());\n        sleep(1);\n        void *p = malloc(10);\n        memset(p, 0, 10);\n        free(p);\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我做了与上面相同的事情,没有“未知”部分。

\n\n

如何解释/解决这个问题?

\n

Arn*_*ita 7

[unknown]输出中的块引用动态共享对象 ( DSOperf report )的名称。无法解析DSO路径,因此打印. 根据最新的内核源代码树(撰写本文时为 5.3.9),您可以在此处查看。perf report[unknown]

重要的是要知道 DSO 符号的确定是在采样事件地址的帮助下进行的。函数thread__resolve正是负责执行此操作。在较旧的内核中,该thread__resolve方法有另一个名称 - perf_event__preprocess_sample_addr

根据输出的快照,看起来在 , 期间采样的事件的地址perf record是 0。这意味着根本无法解析该地址。它是内核空间中的一个地址(查看符号[k] 0000000000000000perf,在您的情况下,无法解析它。

注释突出显示设置perf_event_paranoid为合适的值,以便您可以成功探测内核和用户空间事件。设置perf_event_paranoid为允许您正确探测内核空间中的事件的值应该是正确解析地址的“一步”。