我写了一个测试程序,它只包含一些无限循环
内部计算,并执行否
I / O操作.我尝试启动程序的两个实例,一个高
niceness值,另一个具有低niceness值:
sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test
taskset命令确保两个程序在同一核心上执行.
与我的预期相反,顶级报道称这两个项目获得了约50%的成绩
计算时间.这是为什么? 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)和过程的好价值(与…相比)
同一自动组中的其他进程).