Linux

perf 命令详解

·6 分钟阅读·2015 字
📋 目录

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

操作:

  1. 回车展开函数调用树,自上而下:调用方→被调用方
  2. 百分比 = 该函数采样命中占比,占比越高 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

火焰图看图规则

  1. 横向宽度 = CPU 占用耗时比例,越宽越耗 CPU
  2. 纵向 = 调用栈,从上到下:父函数→子函数
  3. 色块:单个函数;点开可搜索函数名

优势:一眼看出整条调用链路,比如: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 区别]]

关联文档