以相同 nice 值运行的所有进程将获得相等的 cpu-timeslice。
这是一个启动 2 个进程的简单测试,它们都执行完全相同的操作。一个在后台启动,另一个在前台启动。
dd if=/dev/zero of=/dev/null bs=1 &
dd if=/dev/zero of=/dev/null bs=1
随后运行top 命令的相关摘录
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1366 root 20 0 1576 532 436 R 100 0.0 0:30.79 dd
1365 root 20 0 1576 532 436 R 100 0.0 0:30.79 dd
接下来,如果两个进程都限制在同一个CPU上,
taskset -c 0 dd if=/dev/zero of=/dev/null bs=1 &
taskset -c 0 dd if=/dev/zero of=/dev/null bs=1
随后运行top 命令的相关摘录再次显示
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1357 root 20 0 1576 532 436 R 50 0.0 0:38.74 dd
1358 root 20 0 1576 532 436 R 50 0.0 0:38.74 dd
两个进程都在竞争 CPU 时间片并且具有同等优先级。
最后,
kill -SIGINT 1357 &
kill -SIGINT 1358 &
kill -SIGINT 1365 &
kill -SIGINT 1366 &
导致复制的数据量和吞吐量相似。
25129255+0 records in
25129255+0 records out
25129255 bytes (25 MB) copied, 34.883 s, 720 kB/s
由于各个进程响应中断信号并停止运行的确切时间不同,吞吐量可能会出现细微的差异。
但也请注意 sched_autogroup_enabled 存在。
如果启用,sched_autogroup_enabled 确保现在在各个 shell 之间执行分配 cpu-timeslice 的公平性。通过在各种活动 shell 之间平均分配 cpu。
因此,如果一个 shell 启动 1 个进程 A,
另一个 shell 启动 2 个进程 B 和 C,
那么 CPU 执行时间片通常会分布为
A <-- 50% <---- shell1 50%
B <-- 25% <-.
C <-- 25% <--`- shell2 50%
(尽管所有 3 个进程 A、B 和 C 都在同一个 nice 级别运行。)