火焰图是 svg 格式的矢量图,基于 perf 软件性能分析工具。通过对软件在系统上的工作行为记录进行采样。并将数据进行图形化,从而获得比较直观的可视化数据矢量图。
火焰图的官方教程:Flame Graphs (brendangregg.com)
perf
基于linux平台的perf,对指定进程进行采样,生成火焰图。
火焰图
火焰图能够展示不同的方面:
- 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
...