2014-09-25 69 views
2

我使用Ubuntu的12.04 PERF工具Hadoop的Java代码符号进行解码来分析的Hadoop的2.4.1地图系统级性能/做减少作业:如何让PERF到

perf record -ag -F 100 sleep 60 

我的目标是确定哪些进程/例程正在使用cpu并确定优化的候选者。

内核符号被正确解码,但java代码不正确。 Perf报告看起来是这样的:

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代码的符号?

+0

要看什么JVM供应商你。如果它是oracle,如果Oracle想给你source/dbg符号,你可以发送一封不错的邮件。 – 2014-09-25 12:50:07

+0

是的,它是oracle。猜猜我可能需要切换到openjdk?我的印象是,使用他们的版本会更好,但现在我正在重新考虑...... – seacoder 2014-09-25 13:04:54

+0

为什么你想看看JVM?你认为瓶颈在java解释器中吗? – 2014-09-25 13:14:42

回答

5

事实证明perf输出中显示的perf- $ pid.map对象与JIT编译的Java代码相关联。为了使perf能够解码这些符号,java代码需要生成/tmp/perf-$pid.map符号映射文件。

github上有一个perf-map-agent库,可用于为JIT代码生成符号映射文件。使用该库后,将-agentpath:<dir> /libperfmap.so添加到java命令行。

为了让Hadoop作业产生的符号映射,加线,如下面以hadoop-env.sh:

export HADOOP_JAVA_PLATFORM_OPTS="-agentpath:/usr/lib/oprofile/libjvmti_oprofile.so $HADOOP_JAVA_PLATFORM_OPTS" 
export JAVA_TOOL_OPTIONS="-agentpath:/usr/lib/libperfmap.so $JAVA_TOOL_OPTIONS"