1. 引言
火焰图因其直观的视觉效果和丰富的信息展示而备受青睐。它通过图形化的方式展示了程序执行过程中各个函数调用的时间分布,帮助开发者快速定位性能瓶颈。
生成火焰图的过程虽然看似复杂,但实际上只需几步即可完成。接下来我们将详细介绍如何使用 perf
工具生成火焰图。
2. 操作步骤
以下是使用 perf
工具生成火焰图的具体步骤:
2.1 数据采集
首先,我们需要收集性能数据。这里我们使用 perf record
命令来记录一段时间内的性能数据,生成 perf.data
文件。
[root@7DGroup FlameGraph]# perf record -F 99 -a -g -- sleep 60
[ perf record: Woken up 7 times to write data ]
[ perf record: Captured and wrote 1.868 MB perf.data (11880 samples) ]
[root@7DGroup FlameGraph]# ll
total 1924
drwxr-xr-x 7 root root 4096 Mar 4 07:42 FlameGraph
-rw------- 1 root root 1965540 Mar 4 08:45 perf.data
2.2 转换为文本格式
接下来,将采集到的数据转换为文本格式,方便后续处理。使用 perf script
命令生成 out.perf
文件。
[root@7DGroup FlameGraph]# perf script > out.perf
[root@7DGroup FlameGraph]# ll
total 7460
drwxr-xr-x 7 root root 4096 Mar 4 07:42 FlameGraph
-rw-r--r-- 1 root root 5668491 Mar 4 08:46 out.perf
-rw------- 1 root root 1965540 Mar 4 08:45 perf.data
2.3 折叠栈信息
为了进一步处理,我们需要折叠栈信息。使用 stackcollapse-perf.pl
脚本将 out.perf
文件转换为折叠格式的 out.folded
文件。
[root@7DGroup FlameGraph]# ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
[root@7DGroup FlameGraph]# ll
total 7576
drwxr-xr-x 7 root root 4096 Mar 4 07:42 FlameGraph
-rw-r--r-- 1 root root 115637 Mar 4 08:47 out.folded
-rw-r--r-- 1 root root 5668491 Mar 4 08:46 out.perf
-rw------- 1 root root 1965540 Mar 4 08:45 perf.data
2.4 生成 SVG 文件
最后一步是生成火焰图的 SVG 文件。使用 flamegraph.pl
脚本将 out.folded
文件转换为可视化的 kernel.svg
文件。
[root@7DGroup FlameGraph]# ./FlameGraph/flamegraph.pl out.folded > kernel.svg
[root@7DGroup FlameGraph]# ll
total 7732
drwxr-xr-x 7 root root 4096 Mar 4 07:42 FlameGraph
-rw-r--r-- 1 root root 157603 Mar 4 08:48 kernel.svg
-rw-r--r-- 1 root root 115637 Mar 4 08:47 out.folded
-rw-r--r-- 1 root root 5668491 Mar 4 08:46 out.perf
-rw------- 1 root root 1965540 Mar 4 08:45 perf.data
2.5 查看火焰图
生成的 kernel.svg
文件可以通过浏览器或图像查看器打开,直观地展示程序的性能瓶颈。
3. 总结与展望
除了 perf
工具,其他类似工具如 systemtap
和 dtrace
也能生成火焰图。火焰图不仅在系统性能优化中发挥重要作用,还在 Javascript 优化、代码优化等领域得到广泛应用。
理解火焰图的关键在于识别那些“宽且平”的部分,这些部分往往表示耗时较长的函数调用,是性能优化的重点。