You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何绑定Core 0的应用在所有4个逻辑核均有用户态周期?

问题:绑定到Core 0的进程为何在所有CPU核上都有用户态周期计数?

我编写了如下测试应用:

int main()
{
    // 调用sched_setaffinity()将亲和性设置为core 0

    while(true)
    {
    }

    return 0;
}

我的系统拥有2个物理核,共4个逻辑核。我希望仅查看该应用所使用CPU核的perf事件计数器,于是执行以下Perf命令(运行数秒后终止):

sudo perf stat -e cycles:u --cpu=0 --delay=1000 ./app

我分别将命令中的cpu id改为0、1、2、3各执行一次,结果显示每次的cycles:u均大于0。为何绑定到core 0的应用会在全部4个CPU核上产生用户态周期?显然其中3个核不应执行该应用的用户态指令才对。


分析与解答

你遇到的问题核心是对perf stat的--cpu选项理解有误:

  • --cpu=X的作用是监控整个CPU X上所有用户态进程的周期事件,而非仅统计你启动的./app在该核上的事件。哪怕你的app绑定在Core 0,当你指定--cpu=1/2/3时,perf会统计对应逻辑核上所有用户态活动的周期——比如perf自身进程调度到该核时的用户态执行、系统中临时运行的其他用户态小进程,都会被计入cycles:u。
  • --delay=1000只是延迟统计开始的时间,但延迟期间perf已完成./app的启动,之后的统计依然是针对目标CPU的全局用户态事件,而非仅./app的。

如果只想统计./app的用户态周期(它已绑定到Core 0),正确的做法是去掉--cpu选项,直接运行:

sudo perf stat -e cycles:u --delay=1000 ./app

如果要精确统计该进程在特定核上的事件,可以先启动./app,再针对其PID进行监控:

# 后台启动app
./app &
# 获取进程PID
APP_PID=$!
# 统计该进程在Core 0上的用户态周期
sudo perf stat -e cycles:u --cpu=0 -p $APP_PID
# 结束进程
kill $APP_PID

这样就能避免混入其他进程的计数,仅统计你的app在目标核上的用户态周期。

内容的提问来源于stack exchange,提问作者intrigued_66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:33:44