火焰图:最好用的性能分析工具
火焰图:最好用的性能分析工具
火焰图(Flame Graph)是一种用于可视化软件性能剖析数据的工具,它提供了一种直观的方式来理解代码的执行时间和调用关系。本文将详细介绍火焰图的基本概念、使用场景以及如何使用Perf工具生成火焰图。
火焰图介绍
火焰图(Flame Graph)是一种用于可视化软件性能剖析数据的工具,它提供了一种直观的方式来理解代码的执行时间和调用关系。由Brendan Gregg首次提出,并成为分析性能问题的强大工具。
读懂火焰图
- X轴:由多个方块组成,一个方块代表一个函数。在X轴占的宽度越宽,表示它被采样到的次数越多,可以简单地粗暴地近似理解为执行时间。
- Y轴:表示函数调用栈,调用栈越深,火焰就越高。顶部是CPU正在执行的函数,下方都是它的父函数。
什么时候使用 On-CPU 火焰图?什么时候使用 Off-CPU 火焰图呢?
- 取决于当前的瓶颈到底是什么:
- 如果是 CPU 则使用 On-CPU 火焰图,(先看CPU是不是快到百分百),
- 如果是 IO 或锁则使用 Off-CPU 火焰图(如果CPU占用率不高,就需要用off-cpu).
- 如果无法确定, 那么可以通过压测工具来确认:
- 通过压测工具看看能否让 CPU 使用率趋于饱和, 如果能那么使用 On-CPU 火焰图
- 如果不管怎么压, CPU 使用率始终上不来, 那么多半说明程序被 IO 或锁卡住了, 此时适合使用 Off-CPU 火焰图.
ON-CPU的示例代码
ON-CPU的示
火焰图生成的三个步骤
采集堆栈
折叠堆栈
生成火焰图
Perf
Perf是Linux操作系统下的性能分析工具,能够进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,从而定位性能瓶颈。它是通过在系统内核中注册一个事件监听器,然后在程序运行时收集相关的事件和数据。具体来说,它利用硬件性能计数器来捕捉一系列事件,包括CPU的缓存命中率、指令和数据的缓存命中率、缓存竞争情况、跟踪程序的函数调用及其参数、系统调用等。
Perf的命令
- record:将所有的分析记录进perf.data
- report :读取perf record创建的数据文件,并给出热点分析结果
- script:读取数据文件中的数据信息
一、采集堆栈
perf record -F 99 -a -g -- sleep 60 (-p 111)
- -F 99:表示每秒采集99次
- -a:对所有 CPU 进程进行采样
- -p 111:是进程号,即对哪个进程进行分析
- -g:表示记录调用栈,
- sleep 60则是持续60秒
执行60秒后会提示表示采集完成,在当前目录会生成一个perf.data的文件
二、折叠堆栈
perf script | ./stackcollapse-perf.pl > out.perf-folded
perf script 是 perf 工具的一个子命令,用于将 perf 收集的事件数据转化为可读的格式。它调用了一个 Perl 脚本 stackcollapse-perf.pl。这个脚本用于折叠(合并)函数调用栈的样本,以便它们可以更容易地在火焰图中表示。输出为out.perf-folded
三、生成火焰图
./flamegraph.pl out.perf-folded > perf.svg
它调用了一个 Perl 脚本 flamegraph.pl。这个脚本用于生成火焰图,这是一种可视化函数调用栈的图形表示。输入是 out.perf.folded 文件,输出是 SVG 格式的火焰图。
tips:
- 火焰图下载:https://github.com/brendangregg/FlameGraph
- 安装perf:yum install perf