任务集不能在isolcpus中的一系列内核上工作

前言我在AMD64芯片组上使用了内核3.2的Debian Wheezy。 我的机器有两个Xeon E5-2690核心。 我设置了引导参数,以便一个CPU上的所有内核专用于一个进程。 为此,我已经在grub中设置了isolcpus = 8,9,10,11,12,13,14,15。

到现在为止还挺好。 现在,让我们说我想使用一个给定的命令孤立的CPU,简单的我只是使用一个简单的无限循环:

$ taskset -c 8-15 bash -c'while true; 做echo hello> / dev / null; 完成“

目前为止,顶级显示核心8的利用率接近100%。 现在让我们说我再次启动该命令:

$ taskset -c 8-15 bash -c'while true; 做echo hello> / dev / null; 完成“

现在顶部显示核心9-15保持空闲,这两个进程共享核心8.如果相反,我这样做:

$ taskset -c 8 bash -c'while true; 做echo hello> / dev / null; 完成“

$ taskset -c 9 bash -c'while true; 做echo hello> / dev / null; 完成“

核心8和9每个都可以得到100%的利用率。 这仅适用于isolcpus,因为具有核心1-7的相同任务集可以在相关核心上正确地分布进程。 此外,“taskset -p”显示8-15进程的关联掩码设置正确。 内核调度程序似乎拒绝使用isolcpus亲和性掩码上指定的最低内核。

现在通常情况下,这对我上面的例子来说并不是什么大不了的,只是为每个进程指定单独的内核。 但是我想在专用CPU上运行一个高度multithreading的应用程序。 我想指定核心集并自动使用线程池,而不必为每个生成的单独线程单独重置处理器关联。

有没有人有任何想法如何让调度程序从isolcpu集给我多个核心?

经过一天的挫折,我已经确定了一个解决scheme。 这种行为似乎是默认的内核调度algorithm(该发行版/内核的SCHED_OTHER)的工件。 改变进程到一个不同的algorithm消除了这个问题,isolcpus充分利用进程/线程。

我结束了使用SCHED_RR,但我也testing了SCHED_FIFO和SCHED_IDLE似乎工作。 可以使用chrt实用程序使用替代algorithm启动该过程:

$ sudo chrt -r 1 [command]

(如果你想以非root用户身份运行,你可以使用setcap工具在与命令相关的二进制文件上启用CAP_SYS_NICE)