进程友好性(优先级)设置对Linux没有影响

Her*_*che 5 linux kernel scheduling nice

我编写了一个测试程序,它只包含一个内部有一些计算的无限循环,并且不执行任何I/O操作.我尝试启动程序的两个实例,一个具有高漂亮度值,另一个具有低漂亮度值:

sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test
Run Code Online (Sandbox Code Playgroud)

taskset命令确保两个程序在同一核心上执行.与我的预期相反,顶级报告称两个程序都获得了大约50%的计算时间.这是为什么?nice命令是否有效?

mtk*_*mtk 6

您看到的行为几乎可以肯定是因为Linux 2.6.38(2010年)中添加了自动组功能.据推测,当您描述运行这两个命令时,它们在不同的终端窗口中运行.如果你在同一个终端窗口中运行它们,那么你应该看到nice值有效.这个答案的其余部分详细阐述了这个故事.

内核提供了一种称为自动分组的功能,可以在多进程,CPU密集型工作负载(如构建具有大量并行构建过程的Linux内核(即make(1) -j标志))的情况下提高交互式桌面性能.

通过以下方式创建新会话时,将创建新的自动组setsid(2); 例如,当启动新的终端窗口时会发生这种情况.通过fork(2)继承其父级的自动组成员身份创建的新进程.因此,会话中的所有进程都是同一自动组的成员.

启用自动分组时,自动组的所有成员都放在同一个内核调度程序"任务组"中.Linux内核调度程序采用一种算法来均衡跨任务组的CPU周期分布.可以通过以下示例描述此对交互式桌面性能的好处.

假设有两个自动组竞争相同的CPU(即,假定单个CPU系统或使用taskset(1) 将所有进程限制在SMP系统上的同一CPU).第一组包含十个来自内核构建的CPU绑定进程make -j10.另一个包含一个CPU绑定的进程:一个视频播放器.自动分组的效果是两组将分别接收一半的CPU周期.也就是说,视频播放器将获得50%的CPU周期,而不仅仅是9%的周期,这可能会导致视频播放质量下降.SMP系统上的情况比较复杂,但总体效果是相同的:调度程序在任务组之间分配CPU周期,这样包含大量CPU绑定进程的自动组不会以牺牲费用为代价来占用CPU周期系统上的其他工作.

漂亮的价值和团队安排

当调度非实时进程(例如,在默认SCHED_OTHER策略下调度的进程)时,调度器采用称为"组调度"的技术,在该技术下线程被调度在"任务组"中.任务组是在各种情况下形成的,相关案例在这里是自动分组.

如果启用setsid(2)了自动分组,则(隐式)放置在自动组中的所有线程(即,由创建的同一会话)形成任务组.因此,每个新的自动组都是一个单独的任务组.

在组调度下,线程的nice值仅对相对于同一任务组中的其他线程的调度决策有影响.就UNIX系统上的良好价值的传统语义而言,这会产生一些令人惊讶的后果.特别是,如果启用了自动分组(这是各种Linux发行版中的默认设置),则nice(1)在进程上使用仅对相对于在同一会话中执行的其他进程(通常是相同的终端窗口)进行调度有效.

相反,对于两个进程(例如)不同会话中唯一的CPU绑定进程(例如,不同的终端窗口,其每个作业都绑定到不同的自动组),在其中一个会话中修改进程的nice值对调度程序相对于其他会话中的进程的决策没有影响.这可能是您看到的情景,但您没有明确提到使用两个终端窗口.

如果要防止自动分组干扰nice此处所述的传统行为,可以禁用该功能

echo 0 > /proc/sys/kernel/sched_autogroup_enabled
Run Code Online (Sandbox Code Playgroud)

请注意,这也会导致禁用自动组功能旨在提供的桌面交互性的好处(参见上文).

自动组很好的价值

可以通过文件查看进程的自动组成员身份/proc/[pid]/autogroup:

$ cat /proc/1/autogroup
/autogroup-1 nice 0
Run Code Online (Sandbox Code Playgroud)

此文件还可用于修改分配给自动组的CPU带宽.这是通过在文件的"nice"范围内写入数字来设置autogroup的nice值来完成的.允许的范围是从+19(低优先级)到-20(高优先级).

autogroup nice设置与process nice值具有相同的含义,但适用于根据其他autogroup的相对漂亮值将CPU周期分配给整个autogroup.对于自动组内的进程,它接收的CPU周期将是自动组的nice值(与其他自动组相比)和进程的nice值(与同一自动组中的其他进程相比)的乘积.

  • 有人如何更改自动组的好值?以及如何查看某个自动组中有哪些进程? (2认同)

bta*_*bta 1

我假设&命令行末尾缺少一个。否则,在第一行完成之前,第二行不会运行。

当两个进程都在运行时,使用类似的东西top并确保它们每个都有您分配的好值。

如果仅使用启动进程taskset,然后renice在运行后调整其优先级,会发生什么情况?