跳转到内容

FlameGraph

来自ACM Class Wiki


FlameGraph

什么是 FlameGraph (火焰图)?它能干什么?

火焰图将程序的性能以可视化的方式表示出来。

从火焰图上,我们可以看到函数调用的过程,以及调用时长与 CPU 占用。

在对程序性能优化时,我们通常会先了解最影响程序运行速度的部分,然后针对此进行优化。如果我们得到了程序的火焰图,我们便可以较为轻松的找到性能瓶颈(通常是火焰图中较长的一部分),然后从这部分的函数调用情况进一步了解其中拖慢程序运行的部分。

如何使用?

此处仅包含 Linux 下(含 WSL2)的环境配置方法。

安装 perf

perf 是 Linux 下的性能分析工具,提供程序的基础运行情况。

要在 WSL2 安装 perf(WSL1 不支持 perf),请先 clone WSL2 kernel 仓库

git clone https://github.com/microsoft/WSL2-Linux-Kernel

并在 tools/perf/ 目录下在命令行中输入 make 进行编译(注意关注命令行输出,并安装缺少的包)

make

其他的非 WSL 下的 Linux 只需要安装包含 perf 的软件包即可。

下载火焰图仓库

clone 火焰图仓库

git clone https://github.com/brendangregg/FlameGraph

运行

运行以下脚本:请将 exe_name 和 flamegraph_path 分别替换成可执行文件和之前 clone 的火焰图仓库的路径!

#!/bin/bash

EXEC_PATH=exe_name
echo "executable file path: $EXEC_PATH"
fl_dir=flamegraph_path
SVG_PATH=perf.svg
input=${INPUT_FILE:-/dev/null}
output=${OUTPUT_FILE:-/dev/null}
echo "input: $input, output: $output"

"$EXEC_PATH" <"$input" >"$output" &
PID=$!
perf record -F 1000 -p $PID -g -- sleep 1
if [ $? -ne 0 ]; then
  exit 1
fi
kill $PID > /dev/null 2>&1
sleep 0.1
kill -9 $PID > /dev/null 2>&1
"$fl_dir/flamegraph.pl" <("$fl_dir/stackcollapse-perf.pl" <(perf script)) > "$SVG_PATH"
if [ $? -ne 0 ]; then
  echo "Flame graph generation failed." >&2
fi
rm -f perf.data

使用技巧

火焰图中,每一个小矩形代表了一个函数,每个矩形上的小矩形代表了该函数所调用的函数。因此阅读火焰图一般是从底部向上看。

从火焰图中,我们可以了解每个函数运行时的

  • 占用时长(与矩形长度成正比)
  • CPU 占用情况(从矩形颜色,红色占用率最高,橙色次之,黄色较低)

优化程序的建议

当我们需要提升某个程序的性能时,我们通常会优先考虑优化大量占用程序运行时间的函数。

因此,在获得程序运行的火焰图后,我们应当先分析占用时间较长的部分,找到真正制约程序性能的部分,然后考虑优化。