perf stat 事件选择

通过 -e 选择硬件、缓存与软件事件: 缓存未命中与分支预测失败常用来锁定执行效率问题。

事件选择

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   # 软件事件看内核行为

事件类别与用途

类别常见事件用来回答什么
硬件周期数、指令数算力利用效率如何
缓存各级缓存未命中是否卡在访存等待
分支分支预测失败控制流是否难以预测
软件上下文切换、缺页、迁移内核行为是否在拖累
事件命名依架构与内核而变,跨机器复制采集脚本前先用清单命令核对名称,避免脚本里写的名称在本机并不存在。
一次挂载过多事件会超出硬件计数器数量,内核改用复用方式轮流测量并给出缩放估算值;需要精确计数时应减少事件数量,分多次采集。

易错点

  • 一次挂过多事件导致复用:数值变成估算,比较两类流量时会得出不可靠结论。
  • 凭记忆写事件名:不存在的名称在部分版本上会被静默忽略,输出里少了一行却不易察觉。
  • 跨机器复用脚本不核对:不同架构与内核版本的事件集合不同,脚本在场外环境静默失效。
  • 只统计不使用:拿到计数后没有与业务时间线或代码路径结合,结论停留在描述现象。
  • 把软件事件的波动直接当成故障:缺页与迁移本身是正常内核行为,需要看幅度与频率。

数据来源与参考

  • man perf-stat
  • man perf-list
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌