假设我有一个有很多核心的 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