perf stat 的观测目标

perf 支持按进程、线程、CPU 与系统范围选择观测对象: 定位问题前先明确观测边界。

观测目标范围

统计之前要先决定观测边界:是整机所有处理器的汇总,还是某个进程、某个线程,或者指定的一组处理器。边界决定了结论能覆盖到哪里,也决定了数据能不能互相比较。同一份报告里混用不同范围的数字,是最常见的误判来源。

基本信息

适用平台Linux(内核自带性能工具)
整机范围汇总所有处理器的计数
进程与线程按进程号或线程号限定观测对象
处理器范围按处理器编号列表限定
拆分输出按线程分别列出,便于定位热点线程

典型使用场景

  • 容量评估使用整机口径,确认机器整体是否已被吃满。
  • 单服务优化使用进程口径,避免被同机其它服务干扰。
  • 绑核部署的服务按处理器范围采样,验证是否只用到了部分核心。
  • 多线程服务按线程拆分,找出消耗最集中的工作线程。
  • 短命进程无法用进程号跟随,改为整机口径或直接统计一条命令。

常用目标

常用目标
perf stat -a -- sleep 5                     # 整机所有处理器
perf stat -p 12345 -t 12346 -- sleep 5      # 指定进程与线程
perf stat -C 0-3 -- sleep 5                 # 指定处理器范围
perf stat --per-thread -p 12345 -- sleep 5  # 按线程拆分输出
perf stat -a -e cycles,instructions -- sleep 5   # 整机效率口径,做容量判断
perf stat ./batch_job.sh                    # 直接统计一条命令,覆盖短命进程

范围与适用判断

目标选项观测范围适用判断
整机范围全部处理器汇总容量与整体饱和度
进程与线程指定对象单服务优化与归因
处理器列表指定核心绑核与亲和性验证
命令形式命令运行期间短命进程与一次性任务
进程退出后统计就结束:对频繁启动退出的短命进程,用进程号跟随几乎采不到有效数据,改用整机口径或直接把命令交给统计工具执行。
整机数据与单进程数据不能直接比较:分母不同,占比与绝对量含义都不一样,混用会得出错误结论。

易错点

  • 把系统级数据与单进程数据混比,得出错误的资源占比结论。
  • 对高频短命进程用进程号跟随,进程已退出导致采样缺失,误判为「没有开销」。
  • 忽略容器与命名空间边界:进程号在不同视角下指向不同对象,采到的是别的进程。
  • 绑核服务用整机口径评估,无法确认是否只跑在少数核心上。
  • 多线程服务不做按线程拆分,热点线程被平均值掩盖。

数据来源与参考

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