为何绑定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
相关产品推荐
相关产品推荐

