首先,我在AMD64芯片组上将Debian Wheezy与内核3.2一起使用。我的机器有两个Xeon E5-2690内核。我设置了引导参数,以便一个CPU上的所有内核都专用于一个进程。为此,我在grub中设置了isolcpus = 8,9,10,11,12,13,14,15。
到目前为止,一切都很好。现在让我们说我想对给定的命令使用隔离的CPU,为简单起见,我将使用一个简单的无限循环:
$ taskset -c 8-15 bash -c'while true; 回声你好> / dev / null; 完成了&
到目前为止,到目前为止,顶部显示核心8的旋转利用率接近100%。现在,假设我再次启动该命令:
$ taskset -c 8-15 bash -c'while true; 回声你好> / dev / null; 完成了&
现在top显示内核9-15保持空闲,并且两个进程共享内核8。如果相反,我这样做:
$ taskset -c 8 bash -c'while true; 回声你好> / dev / null; 完成了&
$ taskset -c 9 bash -c'while true; 回声你好> / dev / null; 完成了&
内核8和9分别获得应有的100%利用率。这仅适用于isolcpus,因为具有内核1-7的相同任务集可以正确地将进程分布在相关内核上。此外,“ taskset -p”显示正确设置了8-15个进程的亲和力掩码。看来内核调度程序拒绝使用任何东西,但isolcpus亲和力掩码上指定的最低内核除外。
现在通常对于我上面的示例来说并没有什么大不了的,只需要为每个进程指定单独的内核即可。但是我想在专用CPU上运行高度多线程的应用程序。我想指定核心集并让线程池自动使用,而不必为生成的每个单独线程分别重置处理器亲和力。
有谁知道如何让调度程序从isolcpu集中为我提供多个内核?