利用perf及FlameGraph生成火焰图
使用之前
如果普通用户使用perf分析程序性能的话,需要将perf_event_paranoid的等级降低。默认是3。
也可以直接使用root权限去运行,但是感觉一般不要随便用root权限去运行东西。
经过实验,发现只需要将perf_event_paranoid的等级设置到1,普通用户即可开启追踪。通过以下命令来设置,/proc/sys/AAA/BBB_ccc的变量都可以通过sysctl AAA.BBB_CCC=XXX的形式设置。
sudo sysctl kernel.perf_event_paranoid=1
注意:本文只介绍如何从函数调用出发生成函数调用火焰图。但是perf的功能远不止函数调用。他还能分析程序运行过程的cache miss以及其它特殊事件,例如跨区访问等。
perf stat可以直接在命令行里面查看程序运行的信息。
perf list可以查看支持的-e event类型。
运行perf记录程序
perf record -F 99 -p 181 -g -- sleep 60 #或者
perf record -F 99 -g your_process
-F 99: 每秒采样99次
-p PID: 指定进程id
-g: 记录调用栈
sleep 60: 持续60秒, 如果不加则一直采样到手动中断(CRTL+C)为止
上面的命令会生成一个perf.data的文件.
perf的运行原理简单概括就是给定一个采样频率,根据采样频率每隔一段时间对CPU进行一次中断并根据记录的程序符号表得到当前运行的函数。最后如果某个函数被抽样的次数越多,代表这个函数运行时间越长。
使用perf record运行之后,会在当前目录下面生成一个perf.data文件。
之后执行perf report -n
可以生成报告的预览。
执行perf script > out.perf
可以 dump 出 perf.data 的内容。
生成火焰图
火焰图生成的脚本来自开源项目FlameGraph,FlameGraph能够将函数调用关系以及占用时间通过svg格式的矢量图表示出来,因其形状像火焰又叫“火焰图”。
火焰图样例:
注意:火焰图上面的顺序并不是函数执行的顺序,是统计之后重新编排的顺序
在GitHub上面下载FlameGraph项目:
git clone https://github.com/brendangregg/FlameGraph.git
执行./stackcollapse-perf.pl out.perf > out.folded
折叠调用栈。
执行./flamegraph.pl out.folded > perf.svg
生成火焰图。
调用脚本
自己写了一个perf2svg的调用脚本,将stackcollapse-perf.pl和flamegraph.p两个文件拷贝到/usr/local/bin目录,然后将perf2svg.sh放到/usr/local/bin目录就能使用perf2svg.sh command
生成火焰图了。
脚本地址: https://gitee.com/xiaobai_Lee/perf2svg
参考文章
Perf:Linux下性能分析工具 https://juejin.im/post/6854573211699380238
在Linux下做性能分析3:perf https://zhuanlan.zhihu.com/p/22194920
使用perf和火焰图分析系统性能 https://codertang.com/2018/12/17/perf/