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 -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则说明缺少调试信息。
参考资料: