事件选择
perf stat 通过事件参数决定要统计什么:硬件事件描述流水线行为(周期数、指令数),缓存事件描述各级缓存的命中情况,软件事件描述内核行为(上下文切换、缺页、迁移),此外还能统计内核追踪点。选对事件才能把笼统的「慢」拆成可行动的方向,否则拿到的只是无差别计数。
基本信息
| 适用平台 | Linux,事件可用性依架构与内核版本 |
|---|---|
| 事件来源 | 硬件性能计数器、内核软件事件、内核追踪点 |
| 核对方式 | 先用事件清单命令检索名称,再写入采集脚本 |
| 组合写法 | 多个事件可用花括号组成一个组一起启用 |
| 注意点 | 同时挂载的事件数受硬件计数器数量限制 |
典型使用场景
- 判断瓶颈在访存还是计算:对比缓存未命中占比与每周期指令数。
- 评估数据结构改动后的缓存表现是否改善。
- 分支密集型代码用分支预测失败率评估控制流代价。
- 用软件事件确认缺页或迁移是否在干扰服务。
- 采集脚本上线前核对事件名在本机是否真实存在。
常用组合
常用组合
perf list | grep -iE 'cache|branch' | head # 先检索本机可用的事件名
perf list cache # 只看缓存类事件
perf stat -e cycles,instructions -p 12345 -- sleep 5 # 基础效率口径
perf stat -e L1-dcache-load-misses,LLC-load-misses,cache-misses -p 12345 -- sleep 5 # 缓存视角
perf stat -e '{cycles,instructions}' -p 12345 -- sleep 5 # 花括号:作为一个组统一启用
perf stat -e context-switches,page-faults -p 12345 -- sleep 5 # 软件事件看内核行为事件类别与用途
| 类别 | 常见事件 | 用来回答什么 |
|---|---|---|
| 硬件 | 周期数、指令数 | 算力利用效率如何 |
| 缓存 | 各级缓存未命中 | 是否卡在访存等待 |
| 分支 | 分支预测失败 | 控制流是否难以预测 |
| 软件 | 上下文切换、缺页、迁移 | 内核行为是否在拖累 |
事件命名依架构与内核而变,跨机器复制采集脚本前先用清单命令核对名称,避免脚本里写的名称在本机并不存在。
一次挂载过多事件会超出硬件计数器数量,内核改用复用方式轮流测量并给出缩放估算值;需要精确计数时应减少事件数量,分多次采集。