前言
前面的文章,我們講述了如何通過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-perf-java-flames
svg圖像可以下鑽等操作,請打開連結檢視
點我參考
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