perf stat 总览用法

perf stat 给出执行窗口内的硬件与软件计数总览, 是判断 CPU 效率与瓶颈方向的入口命令。

计数总览入口

perf stat 给出一个执行窗口内硬件与软件事件的计数总览,用来回答「这段时间里各类事件发生了多少次」。它不做采样归因,因此启动开销小、结论来得快,适合在做深入分析前先圈定方向:是计算密集、内存等待,还是被调度与阻塞拖住。它是内核自带性能工具集里的基础命令。

基本信息

适用平台Linux,工具随内核包或独立工具包装配
常用选项指定进程、全机、指定事件列表、后接命令作为窗口
关注指标任务占用时间、每周期指令数、缓存未命中、分支预测失败、上下文切换
权限要求采集硬件与内核事件通常需要较高权限
输出特点汇总统计,不做调用栈归因

典型使用场景

  • 先判断服务是算力受限还是被阻塞:CPU 占用与每周期指令数给出方向。
  • 两个版本之间的效率对比:同一负载窗口内看单位工作的指令数与周期数。
  • 压测阶段的整体消耗量化,为容量评估提供原始数据。
  • 判断缓存未命中是否为主要矛盾,决定是否转向内存侧分析。
  • 确认上下文切换频繁,决定是否转向调度分析。

最小用法

最小用法
perf stat -p 12345 -- sleep 5                    # 观察指定进程 5 秒
perf stat -e cycles,instructions,cache-misses,branch-misses -p 12345 -- sleep 5   # 指定事件
perf stat -d -p 12345 -- sleep 5                 # 展开更多缓存类事件
perf stat -a -- sleep 5                          # 整机口径,用于容量判断
perf stat --per-thread -p 12345 -- sleep 5        # 按线程拆分,定位到具体线程
perf stat ./your_app --args                       # 直接统计一条命令的运行

输出逐列读法

指标含义判读要点
任务占用时间任务实际获得 CPU 的时间远小于窗口说明任务常被阻塞
每周期指令数指令数除以周期数偏低常与内存等待或依赖链有关
缓存未命中各级缓存未命中的次数与占比占比升高指向数据局部性差
上下文切换被动与主动切换次数偏高需转向调度与锁分析
带百分比的行事件被复用的缩放估算值视为估算,需减少事件数复核
统计窗口必须与业务时段对齐:窗口内没有真实负载,计数再漂亮也说明不了问题,配合命令行形式的窗口更容易控制时间范围。
同时挂载过多事件会超出硬件计数器数量,强制复用后得到的是缩放的估算值;看到百分比标记时应减少事件重新测量,而不是直接采信。

易错点

  • 统计窗口与实际负载时段不同步,数据对不上业务现象。
  • 把缩放估算值当精确计数使用,据此做出调优结论。
  • 对高频短命进程用进程号跟随,进程早已退出导致几乎采不到数据。
  • 只解读单一指标:每个周期指令数偏低可能是内存问题也可能是分支问题,需要交叉判断。
  • 忽略权限不足导致部分事件计数为零,误以为系统真的没有该行为。

数据来源与参考

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