perf 说明
perf 是 Linux 内核提供的性能分析工具,支持硬件性能计数器、动态追踪、静态探针等功能。
perf 安装
yum -y install perf
perf 基础用法
perf [全局选项] <子命令> [子命令选项] [参数]
核心子命令分类
性能分析与采样
| 子命令 |
功能 |
record |
记录系统或进程的性能事件到 perf.data 文件。 |
report |
解析 perf.data,生成性能分析报告(如函数级 CPU 热点)。 |
top |
实时监控系统性能,按 CPU 使用率排序(类似 top 命令的动态视图)。 |
stat |
执行命令并统计硬件事件(如 CPU 周期、缓存命中率、分支预测错误等)。 |
annotate |
对 perf.data 中的代码进行注解,显示热点代码的汇编或源码级耗时。 |
数据文件处理
| 子命令 |
功能 |
script |
将 perf.data 转换为可读的文本格式(如调用栈追踪)。 |
evlist |
列出 perf.data 中记录的性能事件类型。 |
archive |
打包记录性能数据时依赖的二进制文件(用于跨机器分析)。 |
diff |
对比两个 perf.data 文件的性能差异。 |
内核相关工具
| 子命令 |
功能 |
kmem |
分析内核内存分配事件(如 slab 分配器、页面错误)。 |
kvm |
监控虚拟化环境(KVM)的性能事件。 |
sched |
分析调度器行为(如进程切换延迟、运行队列状态)。 |
probe |
动态添加内核或用户空间的追踪点(动态追踪)。 |
trace |
类似 strace,跟踪系统调用和内核事件。 |
锁与内存分析
| 子命令 |
功能 |
lock |
分析锁事件(如争用、等待时间)。 |
c2c |
检测共享数据缓存行的争用(Cache-to-Cache/HITM 分析)。 |
mem |
分析内存访问模式(如加载/存储延迟)。 |
动态追踪与调试
| 子命令 |
功能 |
ftrace |
内核 ftrace 功能的简单封装(需 root 权限)。 |
kallsyms |
读取内核符号表,用于定位内核函数。 |
buildid-list |
列出 perf.data 中记录的构建 ID(用于符号解析)。 |
常用命令示例
perf list
perf list 用于列出当前系统支持的 硬件性能事件、软件事件和跟踪点。
# perf list
List of pre-defined events (to be used in -e):
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
bus-cycles [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
ref-cycles [Hardware event]
alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
LLC-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-store-misses [Hardware cache event]
LLC-stores [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
dTLB-store-misses [Hardware cache event]
dTLB-stores [Hardware cache event]
iTLB-load-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
node-load-misses [Hardware cache event]
node-loads [Hardware cache event]
node-store-misses [Hardware cache event]
node-stores [Hardware cache event]
branch-instructions OR cpu/branch-instructions/ [Kernel PMU event]
branch-misses OR cpu/branch-misses/ [Kernel PMU event]
bus-cycles OR cpu/bus-cycles/ [Kernel PMU event]
cache-misses OR cpu/cache-misses/ [Kernel PMU event]
cache-references OR cpu/cache-references/ [Kernel PMU event]
cpu-cycles OR cpu/cpu-cycles/ [Kernel PMU event]
cstate_core/c3-residency/ [Kernel PMU event]
cstate_core/c6-residency/ [Kernel PMU event]
cstate_core/c7-residency/ [Kernel PMU event]
cstate_pkg/c2-residency/ [Kernel PMU event]
cstate_pkg/c3-residency/ [Kernel PMU event]
cstate_pkg/c6-residency/ [Kernel PMU event]
cstate_pkg/c7-residency/ [Kernel PMU event]
instructions OR cpu/instructions/ [Kernel PMU event]
mem-loads OR cpu/mem-loads/ [Kernel PMU event]
mem-stores OR cpu/mem-stores/ [Kernel PMU event]
msr/aperf/ [Kernel PMU event]
msr/cpu_thermal_margin/ [Kernel PMU event]
msr/mperf/ [Kernel PMU event]
msr/smi/ [Kernel PMU event]
msr/tsc/ [Kernel PMU event]
power/energy-cores/ [Kernel PMU event]
power/energy-pkg/ [Kernel PMU event]
power/energy-ram/ [Kernel PMU event]
ref-cycles OR cpu/ref-cycles/ [Kernel PMU event]
topdown-fetch-bubbles OR cpu/topdown-fetch-bubbles/ [Kernel PMU event]
topdown-recovery-bubbles OR cpu/topdown-recovery-bubbles/ [Kernel PMU event]
topdown-slots-issued OR cpu/topdown-slots-issued/ [Kernel PMU event]
topdown-slots-retired OR cpu/topdown-slots-retired/ [Kernel PMU event]
topdown-total-slots OR cpu/topdown-total-slots/ [Kernel PMU event]
uncore_imc_0/cas_count_read/ [Kernel PMU event]
uncore_imc_0/cas_count_write/ [Kernel PMU event]
uncore_imc_0/clockticks/ [Kernel PMU event]
uncore_imc_1/cas_count_read/ [Kernel PMU event]
uncore_imc_1/cas_count_write/ [Kernel PMU event]
uncore_imc_1/clockticks/ [Kernel PMU event]
uncore_imc_2/cas_count_read/ [Kernel PMU event]
uncore_imc_2/cas_count_write/ [Kernel PMU event]
uncore_imc_2/clockticks/ [Kernel PMU event]
uncore_imc_3/cas_count_read/ [Kernel PMU event]
uncore_imc_3/cas_count_write/ [Kernel PMU event]
uncore_imc_3/clockticks/ [Kernel PMU event]
uncore_imc_4/cas_count_read/ [Kernel PMU event]
uncore_imc_4/cas_count_write/ [Kernel PMU event]
uncore_imc_4/clockticks/ [Kernel PMU event]
| 类别 |
说明 |
| Hardware events |
硬件性能计数器(如 CPU 周期、缓存命中率),依赖 CPU PMU(性能监控单元)支持。 |
| Software events |
内核模拟的软件事件(如上下文切换、缺页中断),无需硬件支持。 |
| Tracepoint events |
内核静态跟踪点(如调度、文件系统、网络事件),需内核启用 CONFIG_TRACEPOINTS。 |
| Raw PMU events |
直接访问 CPU PMU 寄存器的原始事件(格式如 r003c,需参考 CPU 手册)。 |
Hardware Cache Events
|
与 CPU 缓存和 TLB 相关的硬件事件,用于分析缓存效率。 |
Kernel PMU Events
|
与 内核性能监控单元 相关的事件,用于高级硬件行为分析。 |
示例
# 查看所有调度相关事件
perf list 'sched:*'
# 查看指定模块的事件(如网络)
perf list 'net:*'
perf top
功能:实时性能监控。动态显示系统中 CPU 占用最高的函数。
| 参数 |
说明 |
-e <事件> |
指定监控的事件(默认 cycles) |
-K |
隐藏内核空间函数(仅显示用户空间函数) |
-U |
隐藏用户空间函数(仅显示内核空间函数) |
-p <PID> |
监控指定进程 |
示例
perf top

perf stat
功能:性能计数器统计。测量命令执行的硬件/软件事件(如 CPU 周期、缓存命中率)。
| 参数 |
说明 |
-a / --all-cpus |
监控所有 CPU 的性能事件(系统全局视角) |
-p <PID> |
监控指定进程的 PID |
-e <事件> |
指定监控的事件(如 cycles、cache-misses,多个事件用逗号分隔) |
-r <次数> |
重复运行命令并统计平均值(如 -r 5 运行 5 次) |
-d |
显示更详细的事件(包括 L1/L2 缓存、分支预测等) |
示例
perf stat -a -r 3 sleep 5 # 全局统计 5 秒,重复 3 次
Performance counter stats for 'system wide' (3 runs):
20,008.53 msec cpu-clock # 3.999 CPUs utilized ( +- 0.00% )
859 context-switches # 0.043 K/sec ( +- 2.85% )
9 cpu-migrations # 0.000 K/sec ( +- 10.18% )
46 page-faults # 0.002 K/sec ( +- 33.75% )
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
5.002999 +- 0.000198 seconds time elapsed ( +- 0.00% )
perf stat -e L1-dcache-load-misses,L1-dcache-loads -p 1033 sleep 5 # 分析 CPU 缓存命中率
0 L1-dcache-load-misses # 0.00% of all L1-dcache hits
0 L1-dcache-loads # 在 5 秒监控期间,未发生任何 L1 数据缓存的加载操作
5.001182415 seconds time elapsed
perf record
功能:记录性能数据。将性能数据保存到 perf.data 文件(后续可用 perf report 分析)。
| 参数 |
说明 |
-g |
记录调用图(用于生成火焰图) |
-F <频率> |
设置采样频率(如 -F 99 表示每秒采样 99 次) |
-e <事件> |
指定监控的事件(默认 cycles) |
-p <PID> |
监控指定进程 |
--call-graph <方法> |
指定调用图记录方法(dwarf、fp 等) |
示例
perf record -g -F 99 -p 5678 # 记录 PID=5678 的调用图,每秒 99 次采样
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.023 MB perf.data (3 samples) ]
perf report
功能:分析记录的数据。交互式查看 perf.data 的分析结果。
| 参数 |
说明 |
-n |
显示样本数量(而不仅是百分比) |
--stdio |
以非交互式文本模式输出(适合脚本处理) |
-g <类型> |
设置调用图显示方式(如 graph、fractal) |
-s <字段> |
按指定字段排序(如 pid、comm、symbol) |
示例
perf report -n --stdio # 文本模式显示样本数量
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 3 of event 'cpu-clock'
# Event count (approx.): 30303030
#
# Children Self Samples Command Shared Object Symbol
# ........ ........ ............ ............. ................. ........................................
#
66.67% 0.00% 0 vmselect-prod vmselect-prod [.] runtime.goexit.abi0
|
---runtime.goexit.abi0
|
|--33.33%--net.(*netFD).connect.func2
| runtime.selectgo
| runtime.gopark
| runtime.mcall
| runtime.park_m
| runtime.schedule
| runtime.findRunnable
| runtime.netpollBreak
| runtime.write1.abi0
| entry_SYSCALL_64_after_hwframe
| do_syscall_64
| ksys_write
| vfs_write
| __vfs_write
| eventfd_write
|
--33.33%--runtime.gcBgMarkStartWorkers.gowrap1
runtime.gcBgMarkWorker
runtime.systemstack.abi0
runtime.gcBgMarkWorker.func2
runtime.gcDrain
runtime.scanobject
perf report -s symbol # 按函数名排序
Samples: 3 of event 'cpu-clock', Event count (approx.): 30303030
Children Self Symbol
+ 66.67% 0.00% [.] runtime.goexit.abi0
+ 66.67% 0.00% [k] entry_SYSCALL_64_after_hwframe
+ 66.67% 0.00% [k] do_syscall_64
+ 33.33% 33.33% [k] _raw_spin_lock
+ 33.33% 33.33% [k] eventfd_write
+ 33.33% 33.33% [.] runtime.scanobject
+ 33.33% 0.00% [.] net.(*netFD).connect.func2
+ 33.33% 0.00% [.] runtime.selectgo
+ 33.33% 0.00% [.] runtime.gopark
+ 33.33% 0.00% [.] runtime.mcall
+ 33.33% 0.00% [.] runtime.park_m
+ 33.33% 0.00% [.] runtime.schedule
+ 33.33% 0.00% [.] runtime.findRunnable
+ 33.33% 0.00% [.] runtime.netpollBreak
+ 33.33% 0.00% [.] runtime.write1.abi0
+ 33.33% 0.00% [k] __vfs_write
+ 33.33% 0.00% [.] runtime.notetsleep
+ 33.33% 0.00% [.] runtime.notetsleep_internal
+ 33.33% 0.00% [k] __x64_sys_futex
+ 33.33% 0.00% [k] do_futex
+ 33.33% 0.00% [k] futex_wait
+ 33.33% 0.00% [k] ksys_write
+ 33.33% 0.00% [.] runtime.futex.abi0
+ 33.33% 0.00% [.] runtime.gcBgMarkStartWorkers.gowrap1
+ 33.33% 0.00% [.] runtime.gcBgMarkWorker
+ 33.33% 0.00% [.] runtime.systemstack.abi0
+ 33.33% 0.00% [.] runtime.gcBgMarkWorker.func2
+ 33.33% 0.00% [.] runtime.gcDrain
+ 33.33% 0.00% [k] 0xcccccccccccccccc
+ 33.33% 0.00% [.] runtime.mstart.abi0
+ 33.33% 0.00% [.] runtime.mstart0
+ 33.33% 0.00% [.] runtime.mstart1
+ 33.33% 0.00% [.] runtime.sysmon
+ 33.33% 0.00% [k] vfs_write
Tip: System-wide collection from all CPUs: perf record -a
perf script
功能:导出原始数据。将 perf.data 转换为文本格式(适用于生成火焰图或自定义分析)。
| 参数 |
说明 |
-G |
生成调用图数据(与 perf script -g 配合使用) |
--fields |
指定输出字段(如 pid,tid,time,event) |
示例
perf script > out.stack # 导出调用栈数据
perf script --fields comm,pid,tid,time,event # 自定义输出字段
vmselect-prod 1033/1509 758.603214: cpu-clock:
vmselect-prod 1033/1042 786.601098: cpu-clock:
vmselect-prod 1033/1043 818.590253: cpu-clock:
perf probe
功能:动态跟踪点管理。动态添加内核或用户空间的跟踪点。
| 参数 |
说明 |
--add <函数> |
添加跟踪点(如 --add tcp_sendmsg) |
--del <函数> |
删除跟踪点 |
-x <二进制> |
指定用户空间二进制文件(用于跟踪用户态函数) |
示例
perf probe --add 'vfs_read file=+0(%dx):string' # 跟踪 vfs_read 的文件名参数
perf probe --add libc:malloc # 跟踪 libc 库的 malloc 函数
perf trace
功能:系统调用跟踪。类似 strace,跟踪进程的系统调用和信号。
| 参数 |
说明 |
-p <PID> |
跟踪指定进程 |
-e <事件> |
过滤特定系统调用(如 -e open,read) |
-s |
显示系统调用的堆栈跟踪 |
示例
perf trace -e open,read -p 1033 # 跟踪 PID=1033 的 open 和 read 调用
0.000 ( 0.021 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
856.081 ( 0.020 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
1001.796 ( 0.019 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
1268.412 ( 0.018 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
1534.355 ( 0.018 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b6840, count: 8 ) = 8
1856.247 ( 0.018 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
2720.391 ( 0.018 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8
2856.190 ( 0.019 ms): vmselect-prod/1803 read(fd: 4<anon_inode:[eventfd]>, buf: 0x7f3e9c7b67f8, count: 8 ) = 8