Perf 显示不应执行指令的内核的用户空间周期

问题描述 投票:0回答:1

我有一个这样的测试应用程序:

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 的应用程序执行用户空间周期?

其中三个核心肯定不应该为我的应用程序执行用户空间周期?

c++ linux optimization x86 perf
1个回答
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:u
are much harder to explain, if we're talking about
perf stat
*without*
-a` 所以你肯定只计算这些 CPU 上这个进程的周期。

© www.soinside.com 2019 - 2024. All rights reserved.