Docker中使用FlameGraph分析JVM应用性能
开源项目推荐
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
微信订阅号
Docker中使用FlameGraph分析JVM应用性能的更多相关文章
- 使用FlameGraph火焰图分析JAVA应用性能
开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...
- 使用docker查看jvm状态,在docker中使用jmap,jstat
Docker中查看JVM的信息: 1. 列出docker容器:docker ps 2. 标准输入和关联终端:docker exec -it 容器ID bash 3. 查找出j ...
- JDK中自带的JVM分析工具
目录 一.业务背景 二.Jdk-Bin目录 三.命令行工具 1.jps命令 2.jinfo命令 3.jstat命令 4.jstack命令 5.jmap命令 四.可视化工具 1.jconsole 2.v ...
- sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
sql中varchar(n),nvarchar(n) 长度性能及所占空间分析 1.varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. ...
- 性能分析 | JVM发生内存溢出的8种原因及解决办法
推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...
- 在Docker中监控Java应用程序的5个方法
译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.通常情况下,监控的主要目的在于:减少宕机 ...
- Java 8中用法优雅的Stream,性能也"优雅"吗?
之前的文章中我们介绍了Java 8中Stream相关的API,我们提到Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码. 那么,Stream API的性能到 ...
- docker容器网络通信原理分析
概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求.而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信.而本文将分别针对这两 ...
- docker容器网络通信原理分析(转)
概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求.而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信.而本文将分别针对这两 ...
随机推荐
- org.apache.spark.logging类报错
一,1 在使用spark读取kafka数据时,当spark升级到2.0之后,出现如上问题:之前遇到了,当时在工程里面添加了org.apache.spark.Logging类,能够运行. 但是在后期使用 ...
- 『深度应用』NLP命名实体识别(NER)开源实战教程
近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务—命名实体识别(Named Entity Recogni ...
- Mysql的B+ Tree索引
为什么要使用索引? 最简单的方式实现数据查询:全表扫描,即将整张表的数据全部或者分批次加载进内存,由于存储的最小单位是块或者页,它们是由多行数据组成,然后逐块逐块或者逐页逐页地查找,这样查找的速度非常 ...
- ThreadLocalSingleton.h——base
#ifndef MUDUO_BASE_THREADLOCALSINGLETON_H #define MUDUO_BASE_THREADLOCALSINGLETON_H #include <boo ...
- Spring源码剖析5:JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- pringboot pom文件引入本地jar包和对其打jar包
maven引入本地jar包需要在pom文件中天剑如下配置: <dependency> <groupId>com.baidu</groupId> <artifa ...
- Git随身手册
Git随身手册 本文是关于Git探索的一篇文章,阐述了Git的大部分命令和使用方式,并列举了几个典型的使用场景以供参考和体会. 对于Git这个分布式的VCS,从链表的角度来看待是最容易理解的: 一次c ...
- python 21 面向对象
目录 1. 面向对象初步认识 2. 面向对象的结构 3. 从类名的角度研究类 3.1 类名操作类中的属性 3.2 类名调用类中的方法 4. 从对象的角度研究类 4.1 类名() 4.2 对象操作对象空 ...
- Zabbix安装时出现缺少PHP模块,解决过程
我在安装时PHP缺少gettext模块和bcmath模块:一下为解决步骤: 1.进入到PHP源码包目录下的ext目录: #cd /soft/php-/ext 2.会看到ext目录下有gettext目录 ...
- JSP指令、标签以及中文乱码
JSP指令.标签以及中文乱码 一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. JSP指令的基本 ...