排序与过滤
采样数据本身只是样本集合,只有选择合适的聚合维度才能变成可行动的信息。按进程或共享对象聚合能先定层面:问题在业务代码还是在某个依赖库;再按符号下钻到具体函数。配合百分比门槛过滤长尾,报告会从几百行收敛到十几行,主要矛盾随之浮出来。
基本信息
| 适用平台 | Linux(内核自带性能工具) |
|---|---|
| 排序维度 | 进程、线程、共享对象、符号 |
| 过滤方式 | 按占比门槛排除长尾条目 |
| 前提条件 | 目标有符号信息,否则聚合维度只剩地址 |
| 输出形式 | 文本表格或交互界面 |
典型使用场景
- 报告条目太多看不出结构,需要先按层面聚合。
- 区分热点来自业务代码还是依赖库,决定优化归属。
- 多进程混合部署时只看其中一个进程的占比。
- 过滤长尾条目,让评审材料聚焦主要热点。
- 多线程服务按线程聚合,定位消耗集中的线程。
常用组合
常用组合
perf report --stdio --sort comm,dso | head -30 # 先看进程与共享对象
perf report --stdio --sort symbol --percent-limit 1 | head -30 # 过滤长尾,聚焦热点
perf report --stdio --sort pid,sym | head -30 # 带进程号,多个同名进程可区分
perf report --stdio --sort dso | head -20 # 看各库总占比
perf report --stdio --sort symbol -g | head -40 # 展开调用关系
perf report --stdio --sort symbol --percent-limit 0.5 | head -40 # 门槛放宽一点再看一轮排序维度与用途
| 维度 | 看到什么 | 什么时候用 |
|---|---|---|
| 共享对象 | 各库与可执行文件的占比 | 先判断责任归属 |
| 进程与线程 | 哪个进程或线程消耗多 | 混合部署与多线程服务 |
| 符号 | 具体函数占比 | 锁定优化目标 |
| 调用关系 | 热点的上层调用路径 | 判断是否由公共路径引入 |
过滤门槛先宽后紧:一上手就用很高的门槛会把中等占比但结构重要的路径一并滤掉,看不到真实形状。
长时间只盯着排名第一的符号容易漏掉真实结构:多个中等占比符号指向同一条调用路径时,问题往往是整条路径而不是单个函数。