天天看點

Docker中使用火焰圖FlameGraph分析JVM應用性能

前言

前面的文章,我們講述了如何通過perf的方式對java程式進行性能剖析,并生成FlameGraph火焰圖,但是實際生産中,很多企業會将java部署在docker容器當中,這時對docker内運作的java程序進行剖析便成為一件很麻煩的事情。

執行步驟

安裝相關依賴

yum install -y git cmake gcc-c++ gcc perf           

下載下傳項目

git clone https://github.com/zrbcool/docker-flame-graphs.git           

指定JAVA_HOME環境變量

export JAVA_HOME=/root/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH           

編譯項目

cd docker-flame-graphs/
cmake . && make           

找到你要分析的docker程序

docker ps | grep xxx           

找到這個容器的程序Pid

docker inspect --format '{{.State.Pid}}' [CONTAINER_ID]           

修改腳本當中的JAVA_HOME保證與容器内部的JAVA_HOME一緻

vi bin/create-java-perf-map.sh
export JAVA_HOME=/app/3rd/jdk/default           

去掉腳本當中被注釋的指令:

vi bin/docker-perf-top
#删掉下面代碼前面的注釋
sudo perf top -p $host_pid           

在docker-flame-graphs目錄下,執行:

docker cp $(pwd) [CONTAINER_ID]:/docker-flame-graphs           

然後需要确認你的JVM參數增加了-XX:+PreserveFramePointer,如果沒有,需要增加并重新開機服務

現在所有的準備工作已經完成,讓你的JVM程序運作一段時間完成JIT的預熱

然後我們開始分析性能:

cd bin
./docker-perf-top [CONTAINER_ID] [JAVA_ID]
./docker-perf-java-flames [CONTAINER_ID] [JAVA_ID]           

docker-perf-top效果

Docker中使用火焰圖FlameGraph分析JVM應用性能

docker-perf-java-flames

svg圖像可以下鑽等操作,請打開連結檢視

點我
Docker中使用火焰圖FlameGraph分析JVM應用性能

參考

https://github.com/jvm-profiling-tools/perf-map-agent/issues/50  
https://blog.alicegoldfuss.com/making-flamegraphs-with-containerized-java/  
https://github.com/mboussaa/docker-flame-graphs  
http://www.batey.info/docker-jvm-flamegraphs.html  
https://github.com/chbatey/perf-map-agent  
https://blog.alicegoldfuss.com/making-flamegraphs-with-containerized-java/  
https://github.com/jvm-profiling-tools/perf-map-agent  
https://medium.com/netflix-techblog/java-in-flames-e763b3d32166