Appearance
perf 事件体系参考
更新时间:2026-08-06
perf 的事件体系是性能分析的"度量衡"——理解有哪些事件可用、各自含义是什么、如何组合使用,是充分发挥 perf 能力的前提。
关联:perf-stat.md(事件统计)、perf-record.md(事件采样)、PMU 原理
一、事件分类总览

| 分类 | 说明 | 列出方式 | 典型事件数 |
|---|---|---|---|
| Hardware | PMU 硬件计数器 | perf list hw | 6-10 个通用事件 |
| Software | 内核软件计数器 | perf list sw | ~10 个 |
| Tracepoint | 内核静态追踪点 | perf list tracepoint | 1000+ |
| Dynamic | kprobe/uprobe 动态探针 | perf probe -l | 用户自定义 |
| PMU | 处理器特定事件 | perf list pmu | 数百(CPU 型号相关) |
二、查看可用事件
bash
# 列出所有事件
perf list
# 按类别列出
perf list hw # 硬件事件
perf list sw # 软件事件
perf list cache # 缓存事件
perf list pmu # PMU 事件(CPU 特定)
perf list tracepoint # 内核 tracepoint
# 搜索特定事件
perf list | grep cache
perf list | grep sched三、硬件事件(Hardware Events)
3.1 通用硬件事件
| 事件 | 含义 | 典型使用场景 |
|---|---|---|
cycles | CPU 周期数 | 衡量 CPU 时间消耗 |
instructions | 执行的指令数 | 算 IPC = instructions/cycles |
cache-references | 缓存访问次数 | 缓存命中率的分母 |
cache-misses | 缓存未命中次数 | 缓存命中率 = 1 - misses/references |
branches | 分支指令数 | 分支预测命中率的分母 |
branch-misses | 分支预测错误数 | 分支预测错误率 |
bus-cycles | 总线周期数 | 总线带宽分析 |
stalled-cycles-frontend | 前端流水线停顿周期 | 取指/解码瓶颈 |
stalled-cycles-backend | 后端流水线停顿周期 | 执行/访存瓶颈 |
ref-cycles | 参考周期数(固定频率) | 消除频率缩放影响 |
3.2 缓存事件(细分)
| 事件 | 含义 |
|---|---|
L1-dcache-loads | L1 数据缓存加载次数 |
L1-dcache-load-misses | L1 数据缓存加载未命中次数 |
L1-dcache-stores | L1 数据缓存存储次数 |
L1-icache-load-misses | L1 指令缓存未命中次数 |
LLC-loads | Last Level Cache 加载次数 |
LLC-load-misses | Last Level Cache 加载未命中次数 |
LLC-stores | LLC 存储次数 |
dTLB-loads / dTLB-load-misses | 数据 TLB 加载/未命中 |
iTLB-loads / iTLB-load-misses | 指令 TLB 加载/未命中 |
3.3 缓存层级与命中率计算
| 层级 | load 事件 | miss 事件 | 命中率计算 |
|---|---|---|---|
| L1D | L1-dcache-loads | L1-dcache-load-misses | L1 miss rate = misses/loads |
| LLC | LLC-loads | LLC-load-misses | LLC miss rate = misses/LLC-loads |
| 全局 | cache-references | cache-misses | cache miss rate |
四、软件事件(Software Events)
| 事件 | 含义 | 典型场景 |
|---|---|---|
cpu-clock | 每个 CPU 的时钟(默认采样事件) | perf record 默认事件 |
task-clock | 任务占用的 CPU 时钟 | 对比 wall-clock 判断 IO 比重 |
context-switches | 上下文切换次数 | 切换频繁→检查调度/锁 |
cpu-migrations | CPU 核迁移次数 | 迁移多→检查 NUMA 亲和性 |
page-faults | 缺页异常次数(含 minor+major) | 页面分配行为 |
minor-faults | 轻微缺页(从 page cache 分配) | — |
major-faults | 严重缺页(需磁盘 IO) | > 0 → 可能内存不足或 mmap 不当 |
alignment-faults | 对齐故障 | 极少出现,非对齐访问 |
emulation-faults | 仿真故障 | 极少出现 |
五、Tracepoint 事件(常用)
5.1 调度类
| tracepoint | 含义 |
|---|---|
sched:sched_switch | 上下文切换 |
sched:sched_wakeup | 进程被唤醒 |
sched:sched_wakeup_new | 新进程首次唤醒 |
sched:sched_migrate_task | 任务跨核迁移 |
sched:sched_process_exit | 进程退出 |
sched:sched_process_fork | 进程 fork |
sched:sched_stat_runtime | 运行时统计 |
5.2 系统调用类
bash
perf list 'syscalls:sys_enter_*'| tracepoint | 含义 |
|---|---|
syscalls:sys_enter_* | 进入系统调用 |
syscalls:sys_exit_* | 退出系统调用 |
5.3 中断类
| tracepoint | 含义 |
|---|---|
irq:irq_handler_entry | 中断处理入口 |
irq:irq_handler_exit | 中断处理退出 |
irq:softirq_entry | 软中断入口 |
irq:softirq_exit | 软中断退出 |
5.4 网络类
| tracepoint | 含义 |
|---|---|
net:net_dev_xmit | 网络包发送 |
net:netif_rx | 网络包接收 |
napi:napi_poll | NAPI 轮询 |
5.5 块设备类
| tracepoint | 含义 |
|---|---|
block:block_rq_issue | IO 请求发出 |
block:block_rq_complete | IO 请求完成 |
六、事件修饰符
| 修饰符 | 含义 | 示例 |
|---|---|---|
:u | 仅用户态(user) | cycles:u |
:k | 仅内核态(kernel) | cycles:k |
:h | 仅 Hypervisor | — |
:p / :pp / :ppp | 精确采样级别(PEBS) | cycles:pp |
七、常用事件组合
快速诊断
bash
perf stat -e cycles,instructions,cache-references,cache-misses,branches,branch-misses ./prog用户态 vs 内核态
bash
perf stat -e cycles:u,cycles:k,instructions:u,instructions:k ./prog缓存深度分析
bash
perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./prog前端 vs 后端瓶颈
bash
perf stat -e stalled-cycles-frontend,stalled-cycles-backend ./progfrontend > backend→ 指令获取/解码瓶颈(I-Cache miss、分支预测失败)backend > frontend→ 执行/访存瓶颈(Cache miss、数据依赖)
上下文切换分析
bash
perf stat -e context-switches,cpu-migrations,page-faults ./prog八、PMU 事件(处理器特定)
Intel 和 AMD 各有数百个 PMU 事件,比通用硬件事件精细得多:
bash
# Intel
perf list pmu | head -50
# 例如:cpu/event=0x2e,umask=0x4f/ → LONGEST_LAT_CACHE.REFERENCE
# AMD
perf list pmu | head -50
# 例如:ibs_op//, ibs_fetch//这些事件可在 perf stat -e 中使用:
bash
perf stat -e cpu/event=0x2e,umask=0x4f/ ./prog具体事件编码需查阅处理器手册(Intel SDM / AMD PPR)。
九、multiplexing 与 --no-merge
硬件 PMU 计数器数量有限(通常 4-8 个通用计数器)。当请求的事件数超过硬件计数器数量时,perf 会自动 multiplexing(分时轮转),输出中会出现:
bash
2,345,678,901 cache-misses (67.80%) # ← 只统计了 67.80% 的时间加 --no-merge 禁止合并同名事件,配合 -r 多次测量提高置信度。
十、与相关文档的交叉引用
| 场景 | 文档 |
|---|---|
| 用事件做整体统计 | perf-stat.md |
| 用事件做采样分析 | perf-record.md |
| PMU 硬件原理 | PMU 性能监控单元 |
| 缓存一致性协议 | MSI→MESI→MOESI |
| IPC 低的案例分析 | perf 案例集 |
十一、一句话总结
perf 事件体系是性能分析的"度量工具"——硬件事件衡量 CPU/缓存/分支效率,软件事件衡量调度/I/O/内存行为,tracepoint 提供内核精确插桩点,三者组合覆盖从"CPU 内部在忙什么"到"程序与内核在交互什么"的全部视角。