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

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

sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test

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

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

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

创建新会话时会创建新的自动组
通过setsid(2);例如,当启动新的终端窗口时会发生这种情况. fork(2)创建的新进程继承了它
父母的自动组成员资格.因此,一个过程中的所有过程
session是同一个autogroup的成员.

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

假设有两个自动组竞争同一个CPU
(即,假定单个CPU系统或使用任务集(1)
将所有进程限制在SMP系统上的同一CPU中).
第一组包含来自内核的十个CPU绑定进程
build以make -j10开头.另一个包含一个
CPU绑定过程:视频播放器.自动分组的效果是
这两组将分别接收一半的CPU周期.那是,
视频播放器将获得50%的CPU周期,而不是
只有9%的周期,这可能会导致视频质量下降
回放. SMP系统的情况比较复杂,但是
一般效果是相同的:调度程序分配CPU周期
跨任务组,以便包含大的自动组
CPU绑定进程的数量最终不会占用CPU周期
以牺牲系统上的其他工作为代价.

漂亮的价值和团队安排

在调度非实时进程(例如,那些已调度的进程)时
在默认的SCHED_OTHER政策下),
调度程序采用称为“组调度”的技术,在该技术下,线程被安排在“任务组”中.
任务组是在各种情况下形成的,相关案例在这里是自动分组.

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

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

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

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

echo 0 > /proc/sys/kernel/sched_autogroup_enabled

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

自动组很好的价值

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

$cat /proc/1/autogroup
/autogroup-1 nice 0

此文件还可用于修改分配的CPU带宽
到一个自动组.这是通过在“好”中写一个数字来完成的
范围到文件以设置自动组的好值.允许的
范围从19(低优先级)到-20(高优先级).

autogroup nice设置与进程具有相同的含义
很好的价值,但适用于CPU周期的分配
autogroup作为一个整体,基于其他的相对好的值
autogroups.对于自动组内的进程,CPU会循环它
接收将是自动组的良好价值的产物(比较
到其他autogroup)和过程的好价值(与…相比)
同一自动组中的其他进程).

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...