采样与聚合流程
记录加报告是性能分析的核心工作流:记录阶段按固定频率打断程序运行并记下当时的调用栈,报告阶段把成千上万个样本按符号聚合,得到各函数的开销占比。采样频率决定了能否抓到短时热点,调用栈采集方式决定了归因能下钻到多深,二者共同决定报告质量。
基本信息
| 适用平台 | Linux(内核自带性能工具) |
|---|---|
| 关键参数 | 采样频率、调用栈开关、输出文件、观测目标 |
| 报告形式 | 文本输出便于脚本处理,交互界面便于下钻 |
| 前提条件 | 目标与内核有符号信息,否则热点显示为地址 |
| 权限要求 | 采样通常需要较高权限 |
典型使用场景
- 定位服务 CPU 消耗集中的函数,作为优化的起点。
- 优化前后对比热点是否发生漂移,验证改动方向。
- 判断内核态占比是否异常升高,区分业务问题与系统问题。
- 为火焰图准备原始采样数据。
- 排查偶发卡顿:把采样窗口对准现象发生的时段。
记录与查看
记录与查看
perf record -F 99 -a -g -- sleep 30 # 整机 30 秒,带调用栈
perf record -F 499 -p 12345 -g -- sleep 10 # 对单进程提高频率,抓短时热点
perf record -o /tmp/app.data -g -p 12345 -- sleep 20 # 指定输出文件便于对比
perf report --stdio | head -40 # 文本方式查看热点
perf report --stdio --sort symbol --percent-limit 1 | head -30 # 过滤长尾,聚焦主要热点
perf report -i /tmp/app.data --stdio | head -20 # 查看历史采集文件报告读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| 开销占比 | 该符号样本占全部样本的比例 | 排序后定优先级 |
| 样本数 | 命中的样本个数 | 样本太少时结论不稳 |
| 符号 | 函数或方法与内核例程 | 显示为地址说明缺符号 |
| 来源模块 | 符号所属的可执行文件或库 | 区分业务代码与依赖库 |
采样频率不是越高越好:先低后高确认结果稳定,再按需要提高;高频率在短窗口上才有意义,长时间高频率会明显扰动目标。
报告里出现大量未知符号时不要急着下结论,先补上符号与调试信息;基于地址占比做出的优化判断往往是错的。