perf 全套实战:perf top /record/report / 火焰图(运维 SRE 排查 CPU 标准流程,入库整理版)
一、前置原理
perf 依托 CPU 硬件 PMU 性能计数器 + 内核软中断采样,周期性抓取指令栈;
- top:实时采样展示热点函数
- record:保存采样数据到文件
- report:离线分析采样文件
- 火焰图:可视化栈链路
采样默认:CPU 时钟采样,HZ=100,每 10ms 采一次调用栈。
二、perf top 常用参数
bash
运行
# 只看指定PID进程函数
perf top -p <pid>
# 只看用户态,屏蔽内核函数
perf top -p <pid> --user
# 只看内核态
perf top -p <pid> --kernel
# 按采样占比排序,默认就是占比排序
字段说明:
[.]用户态函数;[k]内核函数;[.]/[k]快速区分代码位置
适用:临时快速抓突发热点 CPU,缺点:数据不落地,无法留存、无法深挖调用链。
三、perf record(采集数据落盘,核心)
1. 基础用法
bash
运行
# 采集指定进程,持续30s,数据默认perf.data
perf record -g -p <PID> sleep 30
# -g 关键参数:开启调用栈追踪(必备,没有栈查不了调用链路)
# sleep 30 采集时长,也可以手动Ctrl+C结束采样
# 整机全量采集
perf record -g sleep 30
-g:开启 call-graph 栈捕获,没有这个只能看到孤立函数,看不到谁调用它。- 生成
perf.data二进制采样文件。
补充参数
bash
运行
# 提高采样频率,默认100,最高9999
perf record -g -F 999 -p PID sleep 20
# 只采集用户空间
perf record -g --user -p PID sleep 20
四、perf report(离线解析 perf.data)
bash
运行
perf report
操作:
- 回车展开函数调用树,自上而下:调用方→被调用方;
- 百分比 = 该函数采样命中占比,占比越高 CPU 热点;
适用场景: 线上不能长时间占机、现场采样后打包 perf.data 回本地分析。
五、火焰图(最直观排查,生产首选)
1. 安装脚本
shell
git clone https://github.com/brendangregg/FlameGraph.git
2. 采集 + 生成三步走
bash
运行
#1 采样生成perf.data
perf record -g -p PID sleep 30
#2 导出原始文本
perf script > out.perf
#3 生成svg火焰图
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > cpu.svg
火焰图看图规则
- 横向宽度 = CPU 占用耗时比例,越宽越耗 CPU
- 纵向 = 调用栈,从上到下:父函数→子函数
- 色块:单个函数;点开可搜索函数名
优势:一眼看出整条调用链路,比如:main→A→B→死循环,直接定位业务代码。
六、三种工具选型场景
表格
| 命令 | 适用场景 | 优缺点 |
| perf top | 突发 CPU 打满,快速定位热点函数 | 实时查看,无留存,看不到完整调用链 |
| perf record+report | 离线复盘、留存现场数据 | 可深挖调用栈,文本查看 |
| perf + 火焰图 | 复杂代码、多层调用、Java/C++ 疑难瓶颈 | 可视化直观,排查效率最高 |
七、Java 进程特殊问题(高频踩坑)
默认 perf 看不到 Java 方法名,只显示 jvm 原生符号; 解决:安装perf-map-agent,JVM 导出符号映射,perf 正常解析 java 类名 & 方法。
八、面试卡片(Obsidian 格式)
yaml
tags: #Linux #perf #性能排查 #CPU #面试
题型:实操简答
难度:中级
题目:CPU使用率异常高,使用perf排查完整流程?
精简答案:
shtur定位耗CPU进程PID;
2.perf top -p PID快速粗筛热点函数;
3.perf record -g -p PID sleep 30采集栈信息;
4.用perf report离线分析或生成火焰图,顺着调用链定位异常代码。
拓展:-g参数用于捕获调用栈,火焰图横向代表CPU耗时占比,是复杂链路首选排查方案。
易错点:不加-g无法获取函数调用关系,只能看到孤立函数。
关联:[[perf top 与 top 命令区别|top 与 perf top 区别]]
关联文档
- perf top 与 top 命令区别 — 工具区别 -故障排查Linux CPU 100% 排查 — CPU 排查