性能报告显示带有未解析内核符号的调用图

问题描述

我收集了最后一个分支记录 (LBR) 样本的性能跟踪:

$ sudo perf record -F 99 -a --call-graph lbr sleep 20
[ perf record: Woken up 41 times to write data ]
[ perf record: Captured and wrote 16.786 MB perf.data (73420 samples) ]

因为我已经安装了内核调试符号(通过 Ubuntu 的 linux-image-xyz-dbgsym 包),我在 perf script 显示的示例中看到内核堆栈跟踪:>

Wt--1 48503 [034] 1429895.019844:     646342 cycles:
        ffffffff8d4e4cb5 update_nohz_stats+0x25 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d4e801b update_sd_lb_stats+0x25b (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d4e85b7 find_busiest_group+0x47 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d4e8bdf load_balance+0x15f (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d4e9f73 newidle_balance+0x2b3 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d4ea105 pick_next_task_fair+0x45 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8ded5214 __schedule+0x124 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8ded5833 schedule+0x33 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d547a89 futex_wait_queue_me+0xb9 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d548aa0 futex_wait+0x100 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d54b48f do_futex+0x35f (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d54bbef __x64_sys_futex+0x13f (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8d404207 do_syscall_64+0x57 (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
        ffffffff8e00008c entry_SYSCALL_64+0x7c (/usr/lib/debug/boot/vmlinux-5.4.0-73-generic)
            55c03ef7ad70 pthread_cond_timedwait@plt+0x0 (/home/xyz/myapp)

但是,perf report 无法解析相同的符号。我得到:

-   13.11%     0.00%  Wt--1            [unkNown]                   [.] 0xffffffff8e00008c
   - 0xffffffff8e00008c
      - 12.17% 0xffffffff8d404207
         - 4.64% 0xffffffff8d54bbef
            - 2.89% 0xffffffff8d54b48f
               - 2.68% 0xffffffff8d548aa0
                  - 2.55% 0xffffffff8d547a89
                     - 2.52% 0xffffffff8ded5833
                        - 1.17% 0xffffffff8ded5214
                           - 1.01% 0xffffffff8d4ea105
                              - 0.96% 0xffffffff8d4e9f73
                                 - 0.54% 0xffffffff8d4e8bdf
                                      0.52% 0xffffffff8d4e85b7
                        - 0.65% 0xffffffff8ded54b9
                             0.65% 0xffffffff8d4d6a6a

注意上面的堆栈匹配 perf script 输出中的帧。那么,perf reportperf script 解析符号的方式有何不同?

这是性能报告的详细输出

$ perf report -v --stdio > /dev/null
build id event received for /usr/lib/debug/boot/vmlinux-5.4.0-73-generic: 05638de83d4b5ca5d11614484f9cd5525a8b2713
build id event received for /lib/modules/5.4.0-73-generic/kernel/arch/x86/kvm/kvm.ko: 18e6d209819f08e64e59fa19961c358f60a9d835
build id event received for /lib/modules/5.4.0-73-generic/kernel/drivers/intel/sgx/isgx.ko: 9a37f67aff8f86a47b837ea01e5c1f673b95527a
build id event received for /lib/modules/5.4.0-73-generic/kernel/drivers/net/ethernet/intel/igb/igb.ko: 497aa60f1ff31ae7690a99a8c5a151b3f22abd80
build id event received for /lib/modules/5.4.0-73-generic/kernel/drivers/ata/libahci.ko: 801c3ad29053c29e5078bdb2cbe0e7bda1e43ff0
build id event received for /lib/x86_64-linux-gnu/libpthread-2.27.so: 68f36706eb2e6eee4046c4fdca2a19540b2f6113
build id event received for /lib/x86_64-linux-gnu/libc-2.27.so: ce450eb01a5e5acc7ce7b8c2633b02cc1093339e
build id event received for [vdso]: 75f9eb38e31c3dc2fab6314c45b01b07bd6d047d
build id event received for /home/vsts-agent/bin.2.184.2/libcoreclr.so: 9b44902bfb6d8f9067767e551977f8306f9e8d94
build id event received for /usr/sbin/sshd: 6f0593060a136468805766d2931cbd91157951aa
build id event received for /usr/bin/htop: 27866c7878627b082ca43d3e147f3f867a32b53f
build id event received for /lib/x86_64-linux-gnu/libncursesw.so.5.9: 8bbe057cadb725ac23aed0800c8f8cef05b207f1
Looking at the vmlinux_path (8 entries long)
Using /usr/lib/debug/boot/vmlinux-5.4.0-73-generic for symbols
symsrc__init: cannot get elf header.
Failed to open /home/xyz/mylib.so,continuing without symbols
[vdso] with build id 75f9eb38e31c3dc2fab6314c45b01b07bd6d047d not found,continuing without symbols
Failed to open [sep5],continuing without symbols

请注意,有些用户代码我没有符号,因此正如预期的那样,perf scriptperf report 都缺少符号。这就是上面 symsrc__init 错误的来源。

我已经尝试过的事情:

  • 传递 --vmlinux--kallsyms--modules 参数。这没有明显效果,但让我陷入了自己重建 perf 的陷阱,因此它链接到 libbfd(Ubuntu 的 perf 没有,并且外壳到 addr2line 这使得它在这些情况下非常慢) .
  • 使用 --inverted--children 反转调用链的显示。这并没有改变符号未解析的事实。
  • 使用 --max-stack=8 或类似方法限制显示堆栈的长度。这显着减少了报告中显示的未解析符号的数量,但我认为这只是隐藏了问题,因为它可以防止对来自长调用链的不相交部分的样本进行分组。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)