我有一个这样的测试应用程序:
int main()
{
// calls sched_setaffinity() to set affinity to core 0
while(true)
{
}
return 0;
}
我有 4 个逻辑核心和 2 个物理核心。
我想查看性能事件计数器,但仅限于我的应用程序使用的 CPU 核心。
我运行这个 Perf 命令(几秒钟后杀死它):
sudo perf stat -e cycles:u --cpu=0 --delay=1000 ./app
四次,每次改变cpu id,都显示
cycles:u
> 0.
所有四个 cpu 如何为固定到核心 0 的应用程序执行用户空间周期?
其中三个核心肯定不应该为我的应用程序执行用户空间周期?
当他们说
perf stat --cpu=
选项仍然需要激活系统范围的监控时,-a
的文档似乎是错误的或具有误导性的。
无论有或没有
-a
,它的行为似乎都是相同的,因此计数来自其他进程,例如 GUI 动画、光标闪烁等。或者对于 cycles:k
,来自任何中断处理程序,无论哪个进程是内核的 current
在那核心上。
我在带有内核和 perf 6.5 的 Arch GNU/Linux 系统上对此进行了测试。这里的确凿证据是运行另一个固定到不同核心的无限循环进程,并且在该核心上看到
cycles:u
与从 perf 命令行运行命令的核心相同。
我想知道文档是否错误,并且
--cpu=For
cycles:k, interrupt handlers from timer and device drivers, and from any background stuff like desktop animations or whatever could maybe explain it. Counts for
cycles:uare much harder to explain, if we're talking about
perf stat*without*
-a` 所以你肯定只计算这些 CPU 上这个进程的周期。