火焰图是 svg 格式的矢量图,基于 perf 软件性能分析工具。通过对软件在系统上的工作行为记录进行采样。并将数据进行图形化,从而获得比较直观的可视化数据矢量图。

火焰图的官方教程:Flame Graphs (brendangregg.com)

perf

基于linux平台的perf,对指定进程进行采样,生成火焰图。

image.png

火焰图

火焰图能够展示不同的方面:

  • on-cpu
  • 内存
  • off-cpu
  • Hot/Cold
火焰图类型 横轴含义 纵轴含义 解决问题 采样方式
on-cpu火焰图 cpu占用时间 调用栈 找出cpu占用搞的问题函数;分析代码热路径 固定频率采样cpu调用栈
off-cpu火焰图 阻塞时间 调用栈 i/o、网络等阻塞场景导致的性能下降;锁竞争、死锁导致的性能下降问题 固定频率采样阻塞事件调用栈
内存火焰图 内存申请/释放函数调用次数 调用栈 内存泄漏问题;内存占用高的对象/申请内存多的函数;虚拟内存或物理内存泄漏问题 有四种方式:跟踪malloc/free;跟踪brk;跟踪mmap;跟踪页错误
Hot/Cold火焰图 on-cpu和off-cpu综合展示 调用栈 需要结合cpu占用以及阻塞分析的场景;off-cpu火焰图无法直观判断的场景 on-cpu火焰图和off-cpu火焰图结合

什么时候采用什么类型的火焰图?——取决于当前的瓶颈到底是什么:

  • 如果是 CPU 则使用 On-CPU 火焰图,
  • 如果是 IO 或锁则使用 Off-CPU 火焰图.
  • 如果无法确定, 那么可以通过压测工具来确认:
  • 通过压测工具看看能否让 CPU 使用率趋于饱和, 如果能那么使用 On-CPU 火焰图
  • 如果不管怎么压, CPU 使用率始终上不来, 那么多半说明程序被 IO 或锁卡住了, 此时适合使用 Off-CPU 火焰图.
  • 如果还是确认不了, 那么不妨 On-CPU 火焰图和 Off-CPU 火焰图都搞搞, 正常情况下它们的差异会比较大, 如果两张火焰图长得差不多, 那么通常认为 CPU 被其它进程抢占了.

安装工具

在ubuntu下安装:


//安装采样工具
apt-get install linux-tools-$(uname -r) linux-tools-generic -y

//安装火焰图生成工具
cd /usr/local/src 
git clone https://github.com/brendangregg/FlameGraph.git
ln -s /usr/local/src/FlameGraph/flamegraph.pl /usr/local/bin/flamegraph.pl
ln -s /usr/local/src/FlameGraph/stackcollapse-perf.pl /usr/local/bin/stackcollapse-perf.pl

案例分析