Ubuntu 16.04 LTS - 如何为perf工具启用符号

时间:2017-03-22 00:27:19

标签: java profiling ubuntu-16.04 perf

我正在尝试为我的应用程序收集一些分析数据,然后运行perf工具和Flame Graphs。

我引用了此幻灯片中提供的说明:https://www.slideshare.net/brendangregg/java-performance-analysis-on-linux-with-flame-graphs

以下是我正在运行的命令:

1. sudo perf record -F 997 -a -g
2. sudo perf script > out.stacks01

当我运行第二个命令时,它会显示以下消息:

Failed to open /tmp/perf-9931.map, continuing without symbols.
no symbols found in <some path>, maybe install a debug package?

我做了一些在线浏览,并尝试按照此处提到的安装调试包:https://gist.github.com/NLKNguyen/2fd920e2a50fd4b9701f

然而,当我运行“sudo apt-get update”时,它最终无法说“无法获取......”

有人能弄明白这里发生了什么吗?为了正确安装调试符号包,我需要做什么?

编辑: 我的关键问题是我生成的火焰图中没有Java符号,因此我最终关注上述错误/消息。以下接受的答案为我的原帖提供了很好的解释。但是,我能够通过运行 jmaps 来解决我的问题,如下所示:

sudo perf record -F 997 -a -g -- sleep 300; jmaps 

上面分享的幻灯片共享链接中的说明中记录了这一点。

1 个答案:

答案 0 :(得分:2)

Failed to open /tmp/perf-9931.map消息不是关于不正确的debuginfo - 它是关于分析由JIT生成的代码(并且Java通常使用JIT从类文件生成机器代码),当没有与运行的性能分析代理兼容时。

http://www.brendangregg.com/perf.html#JIT_Symbols中,建议“Java可以使用perf-map-agent”来使用https://github.com/jvm-profiling-tools/perf-map-agent来生成perf的地图文件:

  

架构

     

Linux perf工具将期望从未知的代码执行代码   /tmp/perf-.map中的内存区域。这允许运行时   动态生成代码以提供要使用的动态符号映射   使用全套工具。

     

perf-map-agent是一个代理,它将为其生成这样的映射文件   Java应用程序。它由一个编写C和Java的Java代理组成   Java引导程序应用程序,它将代理程序附加到正在运行的Java上   过程

     

连接代理程序时,它会指示JVM报告代码blob   由JVM在运行时为各种目的生成的。最   重要的是,这包括JIT编译的方法,但也包括各种方法   动态生成的基础架构部分,如动态   为虚拟调度创建了解释器,适配器和跳转表   (见vtable和itable条目)。代理商创建了一个   /tmp/perf-.map文件,每个代码blob填充一行   将内存位置映射到代码blob名称。

     

Java应用程序将Java进程的PID作为参数   以及传递给它的任意数量的附加参数   剂。然后它附加到目标进程并指示它加载   代理库。

https://www.slideshare.net/brendangregg/java-performance-analysis-on-linux-with-flame-graphs中,Gregg使用了特殊的黑客OpenJDK版本 - 幻灯片36 - “-XX:+PreserveFramePointer•我攻击OpenJDK x86_64以支持帧指针”。

从幻灯片41开始,Gregg谈到了/tmp/perf-*.map个文件:

  

修复符号

     

•对于JIT代码,Linux perf已经在寻找外部提供的符号文件:/tmp/perf-PID.map,如果不存在则发出警告   •此文件可由Java代理

创建
# perf script 
Failed to open /tmp/perf-8131.map, continuing without symbols

(另请参阅lkml for“perf:添加对分析jitted代码的支持”“ - https://lwn.net/Articles/633846/和其他)