使用perf生成火焰图

对于性能优化的需求,我们经常会用到火焰图这个方法。Linux下确实有一种比较简单的生成方法,他需要用到perf来生成具体的运行统计信息,然后用FlameGraph来将这个图画出来。

根据你的发行版,perf工具可能有不同的安装方式。例如在Ubuntu中可以通过

# WSL2 Ubuntu20.04
sudo apt install linux-tools-common
# 也有可能是linux-tools-generic

来安装。但是在WSL2的Ubuntu 20.04上,其可能会报错如下

WARNING: perf not found for kernel 5.15.153.1-microsoft

原因是perf这个工具和内核强相关,而WSL2的Ubuntu似乎魔改过内核,所以软件包中下载的perf用不了(相反,WSL2 Debian安装linux-perf就没这个问题,不知道为什么)。但我们还可以通过编译来安装。首先下载源码

# WSL2 Ubuntu20.04
sudo apt install linux-source

具体版本可能因机器而异,我这里装好的是linux-source-5.4.0,接着我们给它解压,编译,安装

# WSL2 Ubuntu20.04
sudo cp /usr/src/linux-source-5.4.0/linux-source-5.4.0.tar.bz2 ~
cd ~
tar -xf linux-source-5.4.0.tar.bz2
cd linux-source-5.4.0/tools/perf
make
make install

make的过程中可能会提示你缺少了flex,bison等工具,按照报错安装一下就行了。安装好之后perf的路径一般会是~/bin/perf,如果没有添加到PATH自行添加。接着我们下载FlameGraph

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

对于某一个程序program,我们通过以下形式生成其运行报告

perf record -g -F 99 -- ./program -i xxx.txt

这里前面的-F是采样频率99Hz的意思。后面的-i xxx.txt的意思是说明,你调用程序的命令行参数像原来一样直接加上就可以了,没参数就不加。

之后你运行perf的目录就会生成一个perf.data文件,然后

perf script -f | /path/to/FlameGraph/stackcollapse-perf.pl | /path/to/FlameGraph/flamegraph.pl > flame.svg

即可生成这个火焰图。

当然,以上内容仅linux可用,因为perf关系到linux内核,所以即使是msys2也没法做到。如果你在用windows,最好的方法可能就是使用visual studio提供的功能去分析。当然也有使用gprof+graphivz的方法,我以前就是用这个,但是这个调用图不怎么好用,gprof我经常遇到不能生成gmon.out的问题,而且gprof似乎并不支持多线程,于是我放弃了,转向perf。

Licensed under CC BY-NC-SA 4.0