火焰图(Flame Graph)
目录
火焰图基本介绍
SystemTap入门介绍
火焰图生成原理
使用火焰图分析线上性能问题。
火焰图基本介绍
火焰图是由Linux性能优化大师Brendan Gregg发明的,从宏观角度查看时间花在了哪里。
火焰图是 svg 格式的矢量图,基于 perf 软件性能分析工具。通过对软件在系统上的工作行为记录进行采样。并将数据进行图形化,从而获得比较直观的可视化数据矢量图。
火焰图的得名就是因为生成后类似一个跳动的火焰。
火焰图可以理解成他的顶端温度最高。顶部就是正在执行的函数
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶山",就表示该函数可能存在性能问题。
火焰图的类型
常见的火焰图类型有
- On-CPU火焰图,(适用于CPU占用高的问题)
- Off-CPU火焰图(适用于I/O、网络阻塞、锁竞争、死锁导致的性能下降)
- 内存火焰图,(申请、释放内存多、内存泄漏)
- Hot/Cold火焰图,(结合On-CPU火焰图和Off-CPU火焰图)
- 其他火焰图JVM、浏览器(原理类似)。
On-CPU火焰图比较常用。
如果是cup怎么样都上不去,就要用到off-CPU火焰图。锁或者阻塞的问题。
如何读火焰图
- X轴:
由多个方块组成,每个方块表示一个函数
函数在X轴占据的宽度越宽,表示它被采样到的次数越多,可以简单粗暴的近似理解为执行时间。 - Y轴:
表示函数调用栈。调用栈越深,火焰就越高
顶部是CPU正在执行的函数,下方都是它的父函数。
通过图象,我们对自己写的代码工作效率一目了然,这样可以针对性优化源码性能。
火焰图生成的三个步骤
1.采集堆栈 perf SystemTap sample-bt…
2.折叠堆栈 stackcollapse.pl
3.生成火焰图 flamegraph.pl
perf
基于Linux平台的perf采样脚本(fg.sh),对指定进程进行采样,生成火焰图perf.svg。
火焰图
perf 采集的数据,可以通过插件生成二维火焰图:
Y 轴是函数块叠加而成,有点像程序调试堆栈;
X 轴代表程序函数,在单位时间内被采样的密集度。函数块越长,说明采样越多,工作频率越高,耗性能越多。
on-cpu火焰图
进程/线程正在运行使用cpu的数据。
生成火焰图步骤
通过脚本可以抓取到对应的进程/线程的数据,并将数据转换为火焰图。(注意,脚本不能监控正在睡眠一直不工作的进程/线程,否则抓取数据失败)
1.安装perf
yum install perf
2.在github上的FlameGraph的releases中下载FlameGraph-1.0.zip,解压后获得其中的stackcollapse-perf.pl和flamegraph.pl
https://github.com/brendangregg/FlameGraph
2.1.也可以用git将其clone下来
git clone https://github.com/brendangregg/FlameGraph.git
3.拷贝stackcollapse-perf.pl和flamegraph.pl到目标机器上。
4.赋予权限
chmod +x flamegraph.pl
和
chmod +x stackcollapse-perf.pl
4.生成perf.data (注意最后28591的是进程/线程的pid)
sudo perf record -e cpu-clock -g -p 28591
5.结束生成
Ctrl + c
6.用perf script工具对perf.data进行解析,生成perf.unfold
perf script -i perf.data &> perf.unfold
7.将perf.unfold中的符号进行折叠
./stackcollapse-perf.pl perf.unfold &> perf.folded
8.最后生成svg图
./flamegraph.pl perf.folded > perf.svg