进程是否绑定到核心?

进程是否绑定到核心?

假设我有一个有很多核心的 CPU。给定的进程一旦启动就绑定到其中一个核心吗?

这是否意味着即使有多个未使用的核心,进程也会变得缓慢?例如,core0 正在被进程 A 和 B 使用,进程 A 使用 100% 的内核,进程 B 无法运行,即使 core1 完全空闲。

它是否正确?

答案1

进程本质上并不与内核绑定。每次进程被调度执行时,它都可以由其关联列表中的任何核心执行。如果未显式设置关联列表,则进程可以在任何核心上运行。

您可以使用该命令检查或设置进程的关联集taskset(请参阅man taskset参考资料 其文档)。它特别写道,

Linux 调度程序将遵循给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:出于性能原因,调度程序会尝试将进程保持在同一 CPU 上,只要可行。因此,强制特定的 CPU 关联性仅在某些应用程序中有用。

例子

sleep 1000 & slpid=$!
echo "PID of sleep is $slpid"            # 5221

taskset --pid $slpid
pid 5221's current affinity mask: 3      # bitmask

taskset --cpu-list --pid $slpid
pid 5221's current affinity list: 0,1    # list of potential cores

taskset --cpu-list --pid 0 $slpid
pid 5221's current affinity list: 0,1
pid 5221's new affinity list: 0          # bound now only to core 0

kill $slpid                              # all done, tidy up

相关内容