1. 介绍

火焰图是一个可视化工具,可以将诸多性能检测相关的命令行工具的结果进行可视化展示,方便侦测性能热点。其支持将以下工具的采样结果进行可视化展示:

Linux: perf, eBPF, SystemTap, and ktap
Solaris, illumos, FreeBSD: DTrace
Mac OS X: DTrace and Instruments
Windows: Xperf.exe

本文以perf为例介绍(关于perf的用法可以参考perf examples如何在Linux上采集性能数据并且生成火焰图。

因为我们采集的是JAVA进程,perf采集的内容只会显示一个JAVA线程的内存地址,不会详细展示其堆栈信息,因此我们需要另外个工具perf-map-agent 来帮助我们

PS: 感觉火焰图来分析JAVA性能热点还是略麻烦,依赖比较多,单纯看JAVA线程的cpu占用top可以考虑使用greys-anatomy。 如果是C++程序或者C程序,用火焰图更加方便些。

2. 监控某进程性能热点

2.1 安装火焰图

clone下github上项目即可

git clone https://github.com/brendangregg/FlameGraph.git

2.2 安装perf-map-agent

git clone https://github.com/jvm-profiling-tools/perf-map-agent 
cd perf-map-agent/ 
sudo yum install cmake 
sudo yum install gcc 
sudo yum install gcc-c++ 
sudo cmake . 
sudo make 

如果cmake提示版本低按照如下方式升级

 wget https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz
 tar -zxvf cmake-3.6.2.tar.gz
cd cmake-3.6.2
 sudo ./bootstrap --prefix=/usr/local
 sudo make
 sudo make install

2.2 性能采用并且生成火焰图

PS:采样频率建议在4000以内,避免造成太多开销

# -F设定频率,-p指定线程,-g表示记录调用栈信息,该命令执行采样5秒后会在当前目录生成perf.data
sudo perf record -F99 -p <PID> -g  sleep 60
# 获取进程堆栈信息
./jmaps 
# 下面是一个工作流,直接通过perf script解析perf.data里面的内容,然后通过perl脚本生成火焰图。将自己的perf.data拷贝到FlameGraph所在目录,再执行以下命令
sudo perf script | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > kaiming-example-perf.svg

将生成的kaiming-example-perf.svg拷贝到本地,并且用浏览器打开就可以看到火焰图了:

2.3 解读火焰图

X轴是CPU时间,色块越宽,表示对应函数占用的CPU时间越多,可能是性能热点。Y轴是函数调用栈,最顶端的是正在执行的函数。如果出现unknow则说明缺少调试信息。

参考资料:

  1. FlameGraph on github