Docker中使用火焰图FlameGraph分析JVM应用性能-阿里云开发者社区

开发者社区> 开发与运维> 正文

Docker中使用火焰图FlameGraph分析JVM应用性能

简介: 手把手教你如何用perf+flamegraph对docker内java程序生成火焰图进行性能分析

前言

前面的文章,我们讲述了如何通过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  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章