Appearance
perf report —— 采样数据分析
更新时间:2026-08-06
perf report 读取 perf record 生成的 perf.data 文件,以交互式 TUI 展示函数级热点分布和调用链关系。
关联:perf-record.md(采样数据)、perf-annotate.md(汇编级深入)、perf-flamegraph.md(火焰图)
一、perf report 能回答什么问题
| 问题 | 选项/操作 |
|---|---|
| 哪个函数占 CPU 最多? | 默认视图,"Overhead" 列降序 |
| 热点函数的调用链是什么? | -g + TUI 中展开 |
| 哪些模块/库消耗大? | --sort=dso,sym 按动态库分组 |
| 某函数被哪些调用者调用? | --children 模式下展开 |
| 如何导出为文本? | --stdio 输出到终端 |
| 只看 top N 热点? | --percent-limit 5 过滤掉 < 5% 的 |
二、基本使用
bash
# 读取 perf.data,进入交互式 TUI
perf report
# 指定文件
perf report -i my_perf.data
# 命令行文本模式(适合脚本)
perf report --stdioTUI 界面操作速查
| 按键 | 作用 |
|---|---|
↑ ↓ / j k | 上下移动光标 |
Enter | 展开/折叠调用链 |
+ | 展开全部调用链 |
a | 对选中的函数进入 perf annotate(汇编视图) |
d / D | 放大/缩小调用栈视图 |
q | 退出 |
? | 帮助 |
三、排序方式(--sort)
bash
# 按动态库 + 函数排序
perf report --sort=dso,sym
# 按进程 + 函数排序(多进程采样时)
perf report --sort=comm,dso,sym
# 按采样地址排序
perf report --sort=sym,dso,srcline
# 按 CPU 核 + 函数(看负载分布)
perf report --sort=cpu,sym常用排序列:
| 列名 | 含义 |
|---|---|
pid | 进程 ID |
comm | 进程/线程名 |
dso | 动态共享对象(.so / 可执行文件) |
sym | 符号(函数名) |
srcline | 源文件:行号(需要 -g 编译) |
cpu | CPU 核编号 |
parent | 调用者符号 |
四、调用图模式(-g / --call-graph)
4.1 被调用者视角(callee,默认)
bash
perf report -g热点函数下展开的是被它调用的子函数。回答:"这个函数把时间花在调用哪些函数上"。
4.2 调用者视角(caller)
bash
perf report -g graph热点函数下展开的是调用它的父函数。回答:"谁在调用这个热点函数"。
4.3 累积模式(--children)
bash
perf report --children显示两列:
- Children:该函数及其所有被调用者的总开销(累积值)
- Self:该函数自身指令的开销(不含子调用)

关键区别:默认视图看 Self("哪条指令最慢"),
--children看累积值("哪个调用链整体最慢")。对"叶子函数开销大但不自知"的情况,用--children找到真正的根源调用者。
五、过滤与输出控制
bash
# 只看开销 > 5% 的符号
perf report --percent-limit 5
# 只看指定动态库中的符号
perf report --dsos=libc.so.6
# 只看指定函数
perf report --comms=your_program
# 只看符号名包含 "hot" 的函数
perf report --symbol-filter=hot
# 显示原始采样计数(不显示百分比)
perf report -n
# 隐藏内核符号
perf report --hide-unresolved六、stdio 模式(脚本友好)
bash
# 文本模式输出
perf report --stdio
# 按函数名排序,显示前 20 条
perf report --stdio --sort=sym -n | head -20
# 输出 CSV
perf report --stdio -n --percent-limit 1七、实战场景
场景 1:快速找到最热的 3 个函数
bash
perf report --stdio --percent-limit 5 -n看 Self 列最高的 3-5 个函数。
场景 2:判断热点是"自己做"还是"子调用做的"
bash
perf report --children --stdio --percent-limit 5对比 Self 和 Children:
- Self ≈ Children → 计算就在本函数内
- Self << Children → 开销在子调用中,需深入展开
场景 3:定位热点函数的源码行
bash
# 需要编译时加 -g
perf report --sort=sym,srcline --stdio --percent-limit 2然后对热点函数按 a 进入 annotate,看到源码与汇编的对照。
场景 4:分析多进程程序的各进程开销
bash
perf report --sort=comm,dso,sym --stdio看哪些进程(comm 列)贡献了主要开销。
八、与相关文档的交叉引用
| 场景 | 文档 |
|---|---|
| 需要重新采样 | perf-record.md |
| 对热点函数看汇编 | perf-annotate.md |
| 生成火焰图 | perf-flamegraph.md |
| 对比优化前后效果 | perf diff |
九、一句话总结
perf report是采样的"阅片灯"——将perf record的快照按函数/调用链聚合排序,让你一眼锁定热点,再通过--children区分"自己做"和"子调用做",用--sort灵活切换分析维度。