perf stat -C X <command>是否在指定核心运行命令及如何获取准确统计结果
问题结论与原理解释
perf stat -C <核心编号>的作用是统计指定核心上全时段所有运行实体的性能事件,并不会自动把后续传入的命令绑定到该核心运行。直接执行perf stat -C 7 ls时,ls的运行核心由内核调度器随机分配,你得到的计数是7号核心在perf运行窗口内所有进程、中断、内核线程的周期总和,和ls本身的开销没有强关联,这就是计数在15万到500万大幅波动的根本原因。- 你用taskset绑核的思路是正确的,但之前的perf参数使用有误:
-C 7 -A参数依然会统计7号核心上所有任务的事件,包含taskset本身的执行开销、7号核上的中断处理、其他常驻内核线程的运行周期,因此计数依然会在200万到600万区间明显波动。taskset本身的执行开销极低,对于普通性能分析来说完全可以忽略,不是波动的主要来源。
正确的单核心性能统计操作
直接对绑定到指定核心的目标进程做进程级性能统计即可,perf会自动只统计目标进程(含其子进程)产生的事件,不会混入同核心上其他无关任务的计数:
taskset --cpu-list 7 perf stat ls
降低统计波动的补充方法
对于ls这类短生命周期程序,天然存在一定统计波动,可以通过以下方式收窄结果范围:
- 提前预热缓存:先执行几次同样的
ls命令,把目录项、动态库、相关文件数据加载到页缓存后再做统计,排除磁盘IO带来的随机差异 - 多次运行取中位数:短程序的单次统计结果容易受偶发中断、调度影响,跑10次以上取中位数能得到更稳定的结果
- 若需要极致精准的结果,可以通过内核启动参数
isolcpus=7把7号核心隔离出通用调度域,确保测试期间没有其他任务被调度到该核心,再配合上述命令统计即可。
内容的提问来源于stack exchange,提问作者confusedandsad
相关产品推荐
相关产品推荐

