FlameGraph
外观
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 占用情况(从矩形颜色,红色占用率最高,橙色次之,黄色较低)
优化程序的建议
当我们需要提升某个程序的性能时,我们通常会优先考虑优化大量占用程序运行时间的函数。
因此,在获得程序运行的火焰图后,我们应当先分析占用时间较长的部分,找到真正制约程序性能的部分,然后考虑优化。