图例 | Java混合模式分析之火焰图实例
这是小小的第五篇
前言
在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容易直接理解,所以采用火焰图进行分析。用图表的形式展示出来。本文将会展示具体实例。
火焰图
火焰图有不同的资源和事件类型,包括的主要数据有 CPU,Memory,Off-CPU,Hot/Cold。等等。下文中,所描述的火焰图指的是CPU的火焰图。
小方块 每个小方块代表一个函数,对应一个栈帧,小方块的宽度表示该函数在采样期间出现的频率,宽度越宽表示出现的频率越高。
栈帧 用于记录函数的活动记录,保存函数局部变量,函数参数等信息。因此想要分析函数调用堆栈关系,这里就需要使用采样得到栈帧信息。
Y 表示函数的调用栈,体现了stack深度,每个垂直方向的顶端小方块表示正在使用CPU的栈的深度。
X 表示采用数据的总量,X表示数据在对调用进行合并之后的结果。根据函数的字母顺序进行排列。X不代表使用CPU的长短,只是说明该方法出现的次数,宽度越宽表示该方法出现的次数越多。X可以直接作为CPU的时间长短。
生成火焰图
采样数据 -> 使用脚本生成 图解如下
工具
火焰图是根据任何包含stack traces 的 profile 数据生成,需要采集stack traces 数据, 列举如下的工具,采集相关的数据
Linux perf_events Mac DTrace and Instruments windows Xperf.exe
这里采用的是perf,在Linux系统下实验
安装
sudo yum install perf
生成数据
sudo perf record -F 99 -a -g -- sleep 30
此时会在当前目录下生成perf.data文件。
生成火焰图
sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > out.svg
会自动在当前目录下查找perf.data文件,然后生成svg文件。
然后会自动生成相对应的火焰图
Java混合模式火焰图
安装 perf
perf --version
安装perf-map-agent
安装gcc和gcc-c++
sudo yum install gcc
sudo yum install gcc-c++
安装cmake
sudo mkdir /home/q/perf-tools
cd /home/q/perf-tools/cmake-2.8.6
sudo ./configure --prefix=/home/q/cmake-2.8.6
sudo make && make install
安装perf-map-agent
git clone https://github.com/jvm-profiling-tools/perf-map-agent
cd /home/q/perf-tools/perf-map-agent
sudo /home/q/cmake-2.8.6/bin/cmake . && sudo make
配置Java选项
JDK >= Java 8 update 60 build 19
参数 **-XX:+PreserveFramePointer**
检查Jdk
java -version
检查JVM
ps wwp `pgrep -n java`|grep PreserveFramePointer --color
设置 -XX:+PreserveFramePointer
-Xms24g -Xmx24g -server -XX:+DisableExplicitGC -Dqunar.logs=$CATALINA_BASE/logs -Dqunar.cache=$CATALINA_BASE/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGC -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=1 -Xloggc:$CATALINA_BASE/logs/gc.log -XX:+PrintSafepointStatistics -XX:ReservedCodeCacheSize=512m -XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly -XX:MaxTenuringThreshold=14 -XX:+PreserveFramePointer
安装FlameGraph
git clone https://github.com/brendangregg/FlameGraph.git
生成脚本
sudo ./gen-flame-graph.sh $SLEEP_SECONDS $PID
具体脚本内容
#!/bin/bash
SLEEP_SECONDS=$1
PID=$2
PERF_TOOLS_HOME=$(pwd)
GEN_RESULTS_DIR=$PERF_TOOLS_HOME/gen-flame-graphs-result
AGENT_HOME=$PERF_TOOLS_HOME/perf-map-agent
AGENT_JAR=$AGENT_HOME/attach-main.jar
AGENT_OUT=$AGENT_HOME/out
FLAME_GRAPH_PL_HOME=$PERF_TOOLS_HOME/FlameGraph
FLAME_GRAPH_GENERAGED_FILE=$PERF_TOOLS_HOME/flamegraph-mixed-model-`date +%Y%m%d-%H%M%S`.svg
MAP_FILE=/tmp/perf-$PID.map
function check_env(){if [[ ! -x $JAVA_HOME ]]; thenecho "ERROR: JAVA_HOME not set correctly; edit $0 and fix"exitfiif [[ ! -x $AGENT_HOME ]]; thenecho $AGENT_HOMEecho "ERROR: AGENT_HOME not set correctly; edit $0 and fix."exitfiif [[ ! -x $GEN_RESULTS_DIR ]]; thenecho "ERROR: '$GEN_RESULTS_DIR' not found;Please mkdir a file :'$GEN_RESULTS_DIR'"exitfi
}
#generate perf.data with command: perf record
function perf_record(){echo "Perf record for all processors with sleep 30 seconds."cmd_perf="sudo perf record -F 99 -a -g -- sleep 30"eval $cmd_perfif [[ -e "./perf.data" ]]; thenecho "SUCCESS: perf.data was generated."elseecho "ERROR: perf.data not generated;edit $0 and fix."exitfi
}
#agent mapping pid
function gen_map_file(){user=$(ps ho user -p $PID)echo "Agent mapping PID $PID with user $user"cmd_agent="cd $AGENT_HOME;java -cp attach-main.jar:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $PID"cmd_agent="sudo -u $user sh -c '$cmd_agent'"eval $cmd_agentif [[ -e "$MAP_FILE" ]]; thenecho "generate map file"chown root $MAP_FILEchmod 666 $MAP_FILEelseecho "ERROR: $MAP_FILE not created."exitfi
}
#generate flame graph
function gen_flame_graph(){cmd_stack="sudo perf script|$FLAME_GRAPH_PL_HOME/stackcollapse-perf.pl --pid|$FLAME_GRAPH_PL_HOME/flamegraph.pl --color=java --width=800 --minwidth=0.5 --title="$PID flame graph" --hash > $FLAME_GRAPH_GENERAGED_FILE"eval $cmd_stack
}
check_env
perf_record
gen_map_file
gen_flame_graph
echo "SUCCESS: generate flame graph."
使用脚本
改脚本是对Java进程的8708采样30s,生成flamegraph-mixed-model-date +%Y%m%d-%H%M%S.svg的Java混合模式火焰图
sudo ./gen-flame-graph.sh 30 8708
生成的图片
小明菜市场
推荐阅读
● 理论 | 教你彻底学会Java序列化和反序列化
● 面试 | 从一个API缓存演化,详细了解Redis各项功能
● 理论 | 六种延迟队列的实现方案
● 实战 | Element UI 父子组件传值与事件绑定(逆向)
● 实战 | Element UI 父子组件传值与事件绑定(正向)
图例 | Java混合模式分析之火焰图实例相关推荐
- java实例_图例 | Java混合模式分析之火焰图实例
这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...
- java火焰_现代化的Java(十三)——火焰图
如果你问我最喜欢的Clojure工具,前五名的话一定会有 Clojure 的火焰图工具 Flames [jstepien/flames] . 火焰图对于现代的程序员不应该陌生,这个工具可以非常直观的显 ...
- local lua 多个_Lua 级别 CPU 火焰图介绍
在 OpenResty 或 Nginx 服务器中运行 Lua 代码如今已经变得越来越常见,因为人们希望他们的非阻塞的 Web 服务器能够兼具超高的性能和很大的灵活性. 有些人使用 Lua 完成一些非常 ...
- 【性能】perf + 火焰图分析软件性能瓶颈
目录 零.即看即用 一.perf 命令 perf简介 perf record参数 命令例子 二.火焰图的含义 三.互动性 四.火焰图示例 五.局限 六.Node 应用的火焰图 七.浏览器的火焰图 八. ...
- ali arthas 火焰图_带你上手阿里开源的 Java 诊断利器:Arthas
本文适合有 Java 基础知识的人群. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>[1]系列,今天给大家带来一款阿里开源的 Java 诊断利器 ...
- 火焰图 性能分析 java,使用火焰图进行Java应用性能分析
作者: 一字马胡 转载标志 [2017-11-19] 更新日志 日期 更新内容 备注 2017-11-19 新建文章 初版 导入 本文主要想要记录进行java应用性能分析的一种方式,也就是使用火焰图来 ...
- Java FlameGraph 火焰图
上周一个偶然的机会听同事提到了Java FlameGraph,刚实验了一下,效果非常好. 一.什么是FlameGraph 直接看图说话.FlameGraph 是 SVG格式,矢量图,可以随意扩大缩小, ...
- 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...
- java 性能调优,使用 async-profiler + FlameGraph火焰图 分析cup消耗热点代码
参考文章 https://www.jianshu.com/p/9364028cca4e 目的:通过分析工具找到项目中占用cpu时间最长的代码片段,优化热点代码,达到优化内存的效果. 1.准备工具,从g ...
最新文章
- 缓解数据包丢失对WAN的影响是当务之急—Vecloud微云
- ibatis迁移到mybatis3
- 预训练生成模型:结合VAE与BERT/GPT-2提高文本生成效果
- 计算机所有数据的表示方式都是用,计算机数据表示
- webpack打包发布
- apache 支持php urlmanager,Yii中urlManager的配置
- 给dubbo接口添加白名单——dubbo Filter的使用
- pandas基础知识---4
- 微型计算机中call指令,微机原理 第四章 微型计算机指令系统.ppt
- DelphiX中的DXSprite单元中涉及到修改
- 计算机操作系统的基本概念
- asp.net助学贷款管理系统
- revit2019 导出obj_Revit导出OBJ格式
- ISE14.7添加工程外部的IP核
- Google街景地图:技术关键部分已开源
- c语言课程设计作业心得体会,【c语言课程设计心得体会】 c语言课程设计报告总结...
- Windows远程连接电脑宿主机,管理服务器的几种快捷方式。
- 力扣题目归类,顺序刷题不再难
- 修复树莓派鼠标移动缓慢迟滞问题
- 判断用户输入的数字是奇数还是偶数