开源项目推荐

Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/httpservlet/dubbo/motan的运行性能统计,并暴露成prometheus等主流时序数据库兼容数据,通过grafana展示趋势。其插件化的架构也非常方便使用者扩展并集成其他开源组件。

请大家给个star,同时欢迎大家成为开发者提交PR一起完善项目。

前言

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

作者其他文章

https://github.com/zrbcool/blog-public

微信订阅号

最新文章

  1. Es6 箭头函数
  2. 08.03 js _oop
  3. ArcGIS Engine10.2如何安装在 VisualStudio2013 开发环境下
  4. Oracle 常用操作【02】数据库特性
  5. 与众不同 windows phone (46) - 8.0 通信: Socket, 其它
  6. LogNet4学习笔记
  7. 【英语】Bingo口语笔记(74) - put系列
  8. linux 虚机增加硬盘大小 转自
  9. C++ 载入dll
  10. jQuery EasyUI API 中文文档 - 菜单按钮(menubutton)
  11. 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers
  12. POJ 1952 BUY LOW, BUY LOWER
  13. 【Python】 配置文件相对路径&软件自动执行的工作目录
  14. 谈.Net委托与线程——创建无阻塞的异步调用(一)
  15. 自动化监控白皮书——WAS监控
  16. android手机抓wireshark包的步骤-tcpdump(需root权限)
  17. 在单文件组件中,引入安装模块里的css的2种方式:script中引入、style中引入
  18. ArrayList相关问题
  19. 为什么我会选择走 Java 这条路?
  20. ogr2ogr使用

热门文章

  1. javascript数组去重 js数组去重
  2. Linux启动之旅
  3. php 中session_set_cookie_params 和 setcookie 函数的区别与用法
  4. mysql注意事项
  5. (三十二)c#Winform自定义控件-表格
  6. npm install 安装很慢
  7. 吉特日化MES-生产制造的几种形态
  8. 新手学习selenium路线图(老司机亲手绘制)
  9. ajax前台数据到后台
  10. Docker跨服务器通信Overlay解决方案(下) Consul集群