文章目录
火焰图(Flame Graphs)是一种可视化技术,用于展示软件程序的运行时性能。它们可以帮助开发者快速识别程序中的热点(即执行时间最长的部分)。本文将指导您如何在 Linux 和 Mac 平台上生成火焰图。
火焰图简介
火焰图是由 Brendan Gregg 创建的性能分析工具,它以一种直观的方式展示了程序的调用栈信息。火焰图的每一层代表函数调用栈的一级,宽度表示该函数在采样期间的相对执行时间。火焰图的顶部通常是热点,因为它们表示最频繁调用的函数。
Linux 平台
在 Linux 上,我们通常使用 perf 工具来收集性能数据,然后使用 FlameGraph 脚本来生成火焰图。
步骤 1: 安装 perf
perf 是 Linux 内核的性能分析工具。在大多数 Linux 发行版中,它可以通过包管理器安装。
# Ubuntu/Debian sudo apt-get install linux-tools-common linux-tools-generic # Red Hat/CentOS sudo yum install perf
步骤 2: 收集性能数据
使用 perf 记录程序的性能数据。假设您要分析程序号为 PID 的程序,那么可以使用下面的命令。
sudo perf record -F 99 -p PID -g -- sleep 30
perf record 表示采集系统事件, 没有使用 -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周期), -F 99 表示每秒 99 次, -p PID 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续 30 秒。执行完这条命令后将在当前目录下生成一个名为 perf.data 的文件,其中包含了性能数据。
步骤 3: 安装 FlameGraph
克隆 FlameGraph 仓库到本地。
git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph
步骤 4: 生成火焰图
使用 perf 脚本和 FlameGraph 工具生成火焰图。
sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg
这将生成一个名为 flamegraph.svg 的火焰图,您可以使用任何支持 SVG 的浏览器来查看它。
Mac 平台
在 Mac 上,我们可以使用 DTrace 来收集性能数据,并使用相同的 FlameGraph 脚本来生成火焰图。
步骤 1: 收集性能数据
使用 DTrace 脚本收集性能数据。您可以使用 Brendan Gregg 提供的 profile.d 脚本。
sudo dtrace -q -x ustackframes=100 -n 'profile-997 /pid == $target/ { @[ustack()] = count(); } tick-60s { exit(0); }' -p `pgrep your_program` -o out.stacks
这将监视 your_program 的性能,并在 out.stacks 文件中输出数据。当然,你也可以使用下面命令实现同样的功能:
sudo dtrace -x ustackframes=100 -n 'profile-97 /execname == "your_program"/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.stacks
步骤 2: 安装 FlameGraph
如果您还没有 FlameGraph 仓库,请按照 Linux 平台的步骤 3 进行操作。
步骤 3: 生成火焰图
使用 FlameGraph 工具生成火焰图。
./stackcollapse.pl out.stacks | ./flamegraph.pl > flamegraph.svg
这将生成一个名为 flamegraph.svg 的火焰图文件。
查看火焰图
无论是在 Linux 还是 Mac 上,您都可以使用任何支持 SVG 格式的浏览器打开生成的 flamegraph.svg 文件,以查看和分析火焰图。
结论
火焰图是一种强大的工具,可以帮助您优化程序性能。通过遵循本文的指南,您可以在 Linux 和 Mac 平台上生成火焰图,并开始分析您的程序。记住,火焰图只是性能分析的一个方面,您可能还需要结合其他工具和技术来获得全面的性能视图。
本博客文章除特别声明,全部都是原创!原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【生成火焰图:Linux 和 Mac 平台的详细指南】(https://www.iteblog.com/archives/10209.html)