这是小小的第五篇

前言

在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有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混合模式分析之火焰图实例相关推荐

  1. java实例_图例 | Java混合模式分析之火焰图实例

    这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...

  2. java火焰_现代化的Java(十三)——火焰图

    如果你问我最喜欢的Clojure工具,前五名的话一定会有 Clojure 的火焰图工具 Flames [jstepien/flames] . 火焰图对于现代的程序员不应该陌生,这个工具可以非常直观的显 ...

  3. local lua 多个_Lua 级别 CPU 火焰图介绍

    在 OpenResty 或 Nginx 服务器中运行 Lua 代码如今已经变得越来越常见,因为人们希望他们的非阻塞的 Web 服务器能够兼具超高的性能和很大的灵活性. 有些人使用 Lua 完成一些非常 ...

  4. 【性能】perf + 火焰图分析软件性能瓶颈

    目录 零.即看即用 一.perf 命令 perf简介 perf record参数 命令例子 二.火焰图的含义 三.互动性 四.火焰图示例 五.局限 六.Node 应用的火焰图 七.浏览器的火焰图 八. ...

  5. ali arthas 火焰图_带你上手阿里开源的 Java 诊断利器:Arthas

    本文适合有 Java 基础知识的人群. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>[1]系列,今天给大家带来一款阿里开源的 Java 诊断利器 ...

  6. 火焰图 性能分析 java,使用火焰图进行Java应用性能分析

    作者: 一字马胡 转载标志 [2017-11-19] 更新日志 日期 更新内容 备注 2017-11-19 新建文章 初版 导入 本文主要想要记录进行java应用性能分析的一种方式,也就是使用火焰图来 ...

  7. Java FlameGraph 火焰图

    上周一个偶然的机会听同事提到了Java FlameGraph,刚实验了一下,效果非常好. 一.什么是FlameGraph 直接看图说话.FlameGraph 是 SVG格式,矢量图,可以随意扩大缩小, ...

  8. 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下

    如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...

  9. java 性能调优,使用 async-profiler + FlameGraph火焰图 分析cup消耗热点代码

    参考文章 https://www.jianshu.com/p/9364028cca4e 目的:通过分析工具找到项目中占用cpu时间最长的代码片段,优化热点代码,达到优化内存的效果. 1.准备工具,从g ...

最新文章

  1. 缓解数据包丢失对WAN的影响是当务之急—Vecloud微云
  2. ibatis迁移到mybatis3
  3. 预训练生成模型:结合VAE与BERT/GPT-2提高文本生成效果
  4. 计算机所有数据的表示方式都是用,计算机数据表示
  5. webpack打包发布
  6. apache 支持php urlmanager,Yii中urlManager的配置
  7. 给dubbo接口添加白名单——dubbo Filter的使用
  8. pandas基础知识---4
  9. 微型计算机中call指令,微机原理 第四章 微型计算机指令系统.ppt
  10. DelphiX中的DXSprite单元中涉及到修改
  11. 计算机操作系统的基本概念
  12. asp.net助学贷款管理系统
  13. revit2019 导出obj_Revit导出OBJ格式
  14. ISE14.7添加工程外部的IP核
  15. Google街景地图:技术关键部分已开源
  16. c语言课程设计作业心得体会,【c语言课程设计心得体会】 c语言课程设计报告总结...
  17. Windows远程连接电脑宿主机,管理服务器的几种快捷方式。
  18. 力扣题目归类,顺序刷题不再难
  19. 修复树莓派鼠标移动缓慢迟滞问题
  20. 判断用户输入的数字是奇数还是偶数

热门文章

  1. pt-heartbeat 监测RDS延迟
  2. 使用OpenSSL工具制作X.509证书的方法及其注意事项总结
  3. iOS-FMDB 使用
  4. 转 Phpstorm调试详解(包含命令行以及浏览器)
  5. mysql GRANT
  6. 在追赶产品上线的路上,我们是否为在为将来“埋雷”呢?
  7. js60秒倒计时防刷新
  8. Python学习笔记——Python的下载与安装
  9. cctv系统车站服务器功能,CCTV系统
  10. c语言通讯录打电话,求c语言编写的通讯录源代码