为什么我的“良好”水平没有反映在 CPU 使用率中?

为什么我的“良好”水平没有反映在 CPU 使用率中?

假设虚拟机有 1 个 CPU。我在两个终端中运行两个类似的 CPU 密集型任务:

/usr/bin/nice -n -20 perl -e 'while(1){$a=1+1;}'
/usr/bin/nice -n 19 perl -e 'while(1){$a=1+1;}'

我原本以为,当我使用 top 检查时,1 个进程会占用所有 CPU,而另一个进程则不会占用任何 CPU(因为没有剩余的空闲时间)。但是...

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
18175 root       1 -20 20376 1460 1132 R  49.9  0.1   0:18.36 perl
18176 root      39  19 20376 1460 1132 R  49.9  0.1   0:15.16 perl   

这是为什么?我希望我的进程只使用空闲的 CPU 周期 :)

在 Linux 3.5.0-17-generic #28-Ubuntu SMP 上测试,2012 年 10 月 9 日星期二 19:31:23 UTC x86_64 x86_64 x86_64 GNU/Linux

答案1

任务调度中有一门“艺术”。标准 Linux/Unix 调度算法允许所有进程在某个时刻获得 CPU。这是通过最初为进程分配两个项目来实现的:(1) 其类别中的最低优先级(由其 nice 确定)和 (2) 再次基于优先级类别的时间增量。随着时间的推移,进程优先级会增加,最高优先级的进程会获得 CPU 时间。此外,在重新计算后,根据当时的最高优先级,不断重新确定获得 CPU 的进程。一旦进程获得 CPU 时间,其优先级就会再次返回到其类别中的最低优先级。

您可以使用“实时”优先级来获得想要的结果,其中最高优先级的进程获得 CPU 并使用它直到优先级中的所有进程都得到满足,然后下一个较低优先级的进程获得可用时间,直到更高优先级的进程需要 CPU,依此类推直到总 CPU 调度增量用完。进程可以放弃部分 CPU 增量,从而导致重新调度。

因此,您会看到,使用标准调度程序时,优先级较低的进程仍然获得 CPU 时间,但速率要低得多。

相关内容