利用perf及FlameGraph生成火焰图

本文介绍如何使用perf工具结合FlameGraph生成火焰图进行程序性能分析。通过调整perf_event_paranoid参数,普通用户也能轻松使用perf追踪程序。此外,还介绍了perf的多种使用方式以及自定义脚本简化操作流程。

利用perf及FlameGraph生成火焰图

使用之前

如果普通用户使用perf分析程序性能的话,需要将perf_event_paranoid的等级降低。默认是3。

perf_setting

也可以直接使用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/

使用 `perf` 生成火焰的步骤如下: 1. **安装必要的工具**: - 确保系统中已安装 `perf`(通常包含在 Linux 内核工具包中,如 `linux-tools-common` 和 `linux-tools-generic`)。 - 安装生成火焰所需的脚本工具,推荐使用 [Brendan Gregg 的 FlameGraph 工具](https://github.com/brendangregg/FlameGraph)。 2. **使用 perf 记录性能数据**: ```bash sudo perf record -F 99 -g -- sleep 30 ``` - `-F 99`:采样频率为每秒 99 次(可根据需要调整)。 - `-g`:采集调用栈信息。 - `-- sleep 30`:性能记录持续 30 秒。你也可以替换为你想分析的具体命令,例如 `./my_application`。 3. **生成 perf.data 的调用栈报告**: ```bash sudo perf script > out.perf ``` 这会将二进制的 `perf.data` 转换为文本格式的调用栈数据。 4. **使用 FlameGraph 脚本生成火焰 SVG 文件**: 假设你已经克隆了 FlameGraph 仓库: ```bash git clone https://github.com/brendangregg/FlameGraph.git cd FlameGraph ../FlameGraph/stackcollapse-perf.pl < ../out.perf | ../FlameGraph/flamegraph.pl > flame.svg ``` - `stackcollapse-perf.pl`:将 perf 输出转换为扁平化的栈摘要。 - `flamegraph.pl`:生成可交互的 SVG 火焰。 5. **查看火焰**: 直接在浏览器中打开 `flame.svg` 即可查看函数调用栈及其占用 CPU 时间的比例。 --- ### 注意事项 - 需要确保被测程序编译时启用了调试符号(如 `-g`),以便获得清晰的函数名。 - 对于内核空间的性能分析,可能需要额外权限或配置。 - 若分析用户态程序但看不到详细函数名,考虑使用 `--call-graph dwarf` 或 `--call-graph fp` 提高准确性。 ```bash # 示例完整流程 sudo perf record -F 99 -g --call-graph dwarf ./my_program sudo perf script > out.perf ~/FlameGraph/stackcollapse-perf.pl out.perf | ~/FlameGraph/flamegraph.pl > flame.svg ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值