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  
复制代码
相关文章
相关标签/搜索