2014-09-25 14 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"