我试图摸索什么是myApp非常忙(90% cpu单线程)。这是一个我不应该重新启动的服务器。我收集了样本
perf record -p 5068 -F 99 --call-graph dwarf sleep 10perf report给了我这个:
+ 100.00% 0.00% myApp [unknown] [.] 0xffffffffffffffff ◆
+ 80.67% 0.67% myApp myApp [.] pipeline_run ▒
+ 67.71% 0.00% myApp myApp [.] QueryProcessor::process我花了一些时间搜索和阅读文档,我怀疑0 0xffffffffffffffff无法被解决,因为perf不知道堆栈底部在哪里,因为它没有启动这个过程。但有人能确认一下吗?或者给我指明正确的方向?
发布于 2021-10-08 04:45:46
在我的例子中,这是由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): 128000https://stackoverflow.com/questions/66507213
复制相似问题