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