如何生成火焰图以及火焰图基本介绍

火焰图是一种用于可视化性能分析的工具,由BrendanGregg发明。它包括On-CPU、Off-CPU和内存等类型的火焰图,帮助识别CPU、I/O等问题。通过perf工具采集数据,然后使用stackcollapse-pl和flamegraph-pl脚本生成SVG图像,以X轴的函数宽度和Y轴的调用栈深度展示程序执行情况,便于性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

火焰图(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值