最近 debug 问题又需要用到火焰图 Flame Graph 了,我所用到的火焰图是用于查看在所需测试的条件下,看内核对各个函数的调用路径以及耗费CPU的比例。在新平台上又搭建了环境,所以记录一下,如果能帮上大家那就更好了。
1 安装
首先是安装,安装主要有两个内容,一个是 perf 一个是 FlameGraph。
1.1 perf
perf 工具我没有仔细研究,只知道是一个 Linux 的性能调优工具。安装的话,网上查的不一定适合 Ubuntu。我是直接用 apt install 安装的。其实这也比较简单,安装完 perf 之后,输入perf然后回车,它会报一些需要安装的其他内容,都安装好就可以了。
1.2 FlameGraph
找好一个地方放文件夹,然后直接git clone即可。
git clone https://github.com/brendangregg/FlameGraph.git
安装好后,直接cd进入该文件夹,里面有很多脚本。
2 生成火焰图
在上述的文件夹内,执行下面的三条命令,即可在文件夹中找到一个名为的perf-kernel的svg文件,当然这个文件名可以根据需要修改。
第一条命令是采集数据,利用了perf。先运行程序,创造需要采集数据的环境,然后跑下面的cmd,这里的一些option可以根据自己的需要做修改,比如时间。
sudo perf record -F 99 -a -g -- sleep 60
下面的两句是生成脚本文件以及生成火焰图,火焰图是svg文件格式,可以用谷歌浏览器等打开。
sudo perf script | ./stackcollapse-perf.pl > out.perf-folded
sudo ./flamegraph.pl out.perf-folded > perf-kernel.svg
3 利用火焰图 Debug
下面就用一个例子来了解和使用Flame Graph。
这题是这样:已经通过ethtool disable 网卡的checksum功能,期待上层自己做checksum的动作,但是怀疑虽然关掉了网卡trx checksum,上层却也没做checksum。简单来看,就是看kernel是否调用了相关的函数。下面是两个火焰图。
第一张火焰图中,我搜索了csum字样,看看有多少符合。可以看到,符合的函数很少,也就是kernel调用的相关函数不多。
然后我从代码逻辑上看到了一些问题,修改代码,得到第二张火焰图如下。这张图一下子就很明显了,不仅符合的函数更多,且调用的flow也都标明了,说明这次上层开始做checksum了,这就验证了一开始的怀疑。
4 总结语
不管是perf工具还是FlameGraph,都有许多的用处,我所用的只是比较浅薄的部分,不得不说,拿到《BPF之巅:洞悉Linux系统和应用性能》这本书后,感觉到自己要学的还有很多,和大家一起努力吧。
如果觉得这篇文章有用的话,可以点赞、评论或者收藏,万分感谢,goodbye~