性能报告的函数在 0xffffffffffffffff

Perf report's function at 0xffffffffffffffff

我正在尝试了解 myApp 忙于处理什么(90% cpu 单线程)。这是我不应该重新启动的服务器。我通过

收集了样本
perf record -p 5068 -F 99 --call-graph dwarf sleep 10

perf report 给我这个:

+  100.00%     0.00%  myApp    [unknown]              [.] 0xffffffffffffffff                                                                                                                           ◆
+   80.67%     0.67%  myApp    myApp                  [.] pipeline_run                                                                                                                                 ▒
+   67.71%     0.00%  myApp    myApp                  [.] QueryProcessor::process

我花了一些时间谷歌搜索和阅读文档,我怀疑 0xffffffffffffffff 无法解决,因为 perf 不知道堆栈底部在哪里,因为它没有启动该过程。但是有人可以确认一下或指出正确的方向吗?

在我的例子中,这是由于 perf 使用的堆栈转储大小太小造成的。那会导致截断的栈底变成0xffffffffffffffff,这会让perf report和朋友认为函数0xffffffffffffffff用的很多

当我使用最大堆栈转储捕获大小时,我摆脱了大部分 0xffffffffffffffff。如果您传递 --call-graph dwarf,将使用 8192 的默认堆栈转储大小。要最大化它,请更改为 --call-graph dwarf,65528.

来自 perf record --help:

    When "dwarf" recording is used, perf also records (user) stack dump
    when sampled.  Default size of the stack dump is 8192 (bytes).
    User can change the size by passing the size after comma like
    "--call-graph dwarf,4096".

如果您尝试使用大于 65528 的值,您会得到

callchain: Incorrect stack dump size (max 65528): 128000