Docker中使用FlameGraph分析JAVA應用性能

開源項目推薦

Pepper Metrics是我與同事開發的一個開源工具(github.com/zrbcool/pep…),其經過收集jedis/mybatis/httpservlet/dubbo/motan的運行性能統計,並暴露成prometheus等主流時序數據庫兼容數據,經過grafana展現趨勢。其插件化的架構也很是方便使用者擴展並集成其餘開源組件。
請你們給個star,同時歡迎你們成爲開發者提交PR一塊兒完善項目。html

前言

前面的文章,咱們講述瞭如何經過perf的方式對java程序進行性能剖析,並生成FlameGraph火焰圖,可是實際生產中,不少企業會將java部署在docker容器當中,這時對docker內運行的java進程進行剖析便成爲一件很麻煩的事情。java

執行步驟

安裝相關依賴c++

yum install -y git cmake gcc-c++ gcc perf
複製代碼

下載項目git

git clone https://github.com/zrbcool/docker-flame-graphs.git
複製代碼

指定JAVA_HOME環境變量github

export JAVA_HOME=/root/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
複製代碼

編譯項目docker

cd docker-flame-graphs/
cmake . && make
複製代碼

找到你要分析的docker進程數據庫

docker ps | grep xxx
複製代碼

找到這個容器的進程Pidbash

docker inspect --format '{{.State.Pid}}' [CONTAINER_ID]
複製代碼

修改腳本當中的JAVA_HOME保證與容器內部的JAVA_HOME一致mybatis

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  
複製代碼
相關文章
相關標籤/搜索