任务集无法在Isolcpus中的一系列内核上工作


13

首先,我在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集中为我提供多个内核?


您可以尝试使用多线程程序吗?bash不是多线程的
c4f4t0r

1
是的,这就是最初引起我注意的原因(我的多线程程序使用的内核不止一个)。在isolcpus集上运行时,创建大量线程的简单python脚本无法利用多个内核。(在非隔离内核上运行时,它将利用所有可用的8个内核)。
user79126 2014年

阅读此linuxtopia.org/online_books/linux_kernel/kernel_configuration/…,这从内核调度程序中排除了cpus,但是在排除了cpus之后,您要在排除的cpus上运行进程吗?
c4f4t0r

1
内核不会在isolcpu上调度线程或进程,除非处理器亲和力掩码指示应使用该线程或进程。否则,isolcpus等同于关闭内核,而目的是出于用户指定的原因保留内核,并确保没有有害的进程使用它。Taskset将亲和性掩码设置为使用8-15范围内的所有内核(在/ proc中选中时已正确设置),因此内核应在空闲内核上调度进程。
user79126 2014年

Answers:


10

经过一天的挫败,我已经确定了解决方案。此行为似乎是默认内核调度程序算法(此发行版/内核的SCHED_OTHER)的伪像。将进程更改为其他算法可以消除该问题,在进程/线程之间可以充分利用isolcpus。

我最终使用了SCHED_RR,但是我也测试了SCHED_FIFO和SCHED_IDLE两者都可以正常工作。可以使用chrt实用程序使用替代算法来启动该过程:

$ sudo chrt -r 1 [命令]

(如果要以非root用户身份运行,则可以使用setcap实用程序在与该命令相关的二进制文件上启用CAP_SYS_NICE)


1
虽然将与内核0,1的亲和性设置为任务,但我的Java应用程序仅利用了第一个内核。'sudo chrt -r 1 [command]'也解决了我的问题。
巴里NL 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.