我正在使用Ubuntu12.04上的perf工具分析hadoop 2.4.1的系统级性能,方法是:
perf record -ag -F 100 sleep 60
我的目标是确定哪些进程/例程正在消耗cpu,并确定优化的候选对象。
内核符号被正确解码,但java代码没有。性能报告类似于:
Samples: 39K of event 'cycles', Event count (approx.): 11326629675790000f9f0 â
+ 10.64% java perf-9201.map [.] 0x00007eff6c188127
+ 10.57% java perf-8988.map [.] 0x00007f71ac7b9a29
+ 9.91% java perf-9077.map [.] 0x00007fa9e92073e0
+ 9.77% java perf-9025.map [.] 0x00007f849cdf41a9
+ 9.26% java perf-8747.map [.] 0x00007f078c6bda82
+ 7.85% java perf-31343.map [.] 0x00007f6671041cb4
+ 5.81% java perf-8835.map [.] 0x00007f5df0d5afc4
+ 5.78% java liblzo2.so.2.0.0 [.] lzo1x_decompress
+ 2.61% java [kernel.kallsyms] [k] copy_user_generic_string
+ 1.58% java libc-2.15.so [.] 0x000000000008ce40
+ 0.93% java perf-9677.map [.] 0x00007f7c81012887
+ 0.86% swapper [kernel.kallsyms] [k] intel_idle
+ 0.69% java libjvm.so [.] SpinPause
所以问题是,如何让perf解码java代码的符号?
1条答案
按热度按时间jk9hmnmh1#
结果表明,perf输出中显示的perf-$pid.map对象与jit编译的java代码相关联。为了让perf能够解码这些符号,java代码需要生成/tmp/perf-$pid.map符号Map文件。
github上有一个perf-map代理库,可以用来为jit代码生成符号Map文件。在库就绪的情况下,将-agentpath:/libperfmap.so添加到java命令行。
要使hadoop作业生成符号Map,请将以下行添加到hadoop-env.sh: