我有一台单核 x86 机器,我在其中执行burnP6
(来自 cpuburn 包)1 秒,然后终止该程序:
while true; do /usr/bin/burnP6 & sleep 1; pkill burnP6; sleep 1; done
如果我用 来检查 CPU 利用率top -d 1
,进程的负载burnP6
通常低于 50%。如果我运行该while true; do ps -e -o cmd,pcpu | grep burnP6; done
命令,CPU 负载具有以下特征:
/usr/bin/burnP6 0.0
/usr/bin/burnP6 9.0
/usr/bin/burnP6 10.0
/usr/bin/burnP6 10.0
/usr/bin/burnP6 11.0
/usr/bin/burnP6 11.0
/usr/bin/burnP6 12.0
/usr/bin/burnP6 12.0
/usr/bin/burnP6 13.0
/usr/bin/burnP6 14.0
/usr/bin/burnP6 15.0
/usr/bin/burnP6 15.0
/usr/bin/burnP6 16.0
/usr/bin/burnP6 16.0
/usr/bin/burnP6 17.0
/usr/bin/burnP6 18.0
/usr/bin/burnP6 18.0
/usr/bin/burnP6 19.0
/usr/bin/burnP6 20.0
/usr/bin/burnP6 20.0
/usr/bin/burnP6 21.0
/usr/bin/burnP6 22.0
/usr/bin/burnP6 22.0
/usr/bin/burnP6 23.0
/usr/bin/burnP6 24.0
/usr/bin/burnP6 24.0
/usr/bin/burnP6 25.0
/usr/bin/burnP6 25.0
/usr/bin/burnP6 26.0
/usr/bin/burnP6 27.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 28.0
/usr/bin/burnP6 30.0
/usr/bin/burnP6 30.0
/usr/bin/burnP6 31.0
/usr/bin/burnP6 31.0
/usr/bin/burnP6 32.0
/usr/bin/burnP6 32.0
/usr/bin/burnP6 33.0
/usr/bin/burnP6 33.0
/usr/bin/burnP6 35.0
/usr/bin/burnP6 35.0
/usr/bin/burnP6 36.0
/usr/bin/burnP6 36.0
/usr/bin/burnP6 37.0
/usr/bin/burnP6 38.0
/usr/bin/burnP6 38.0
/usr/bin/burnP6 39.0
/usr/bin/burnP6 40.0
/usr/bin/burnP6 40.0
/usr/bin/burnP6 41.0
/usr/bin/burnP6 42.0
/usr/bin/burnP6 42.0
/usr/bin/burnP6 43.0
/usr/bin/burnP6 44.0
/usr/bin/burnP6 44.0
/usr/bin/burnP6 45.0
/usr/bin/burnP6 45.0
/usr/bin/burnP6 46.0
/usr/bin/burnP6 46.0
/usr/bin/burnP6 47.0
/usr/bin/burnP6 48.0
/usr/bin/burnP6 48.0
/usr/bin/burnP6 49.0
/usr/bin/burnP6 50.0
/usr/bin/burnP6 50.0
/usr/bin/burnP6 51.0
/usr/bin/burnP6 52.0
/usr/bin/burnP6 52.0
/usr/bin/burnP6 53.0
/usr/bin/burnP6 0.0
如上所示,负载很快就会从 0% 上升到 53%,但随后进程burnP6
会被终止,即它运行的时间太短,无法达到 99% - 100% 的利用率。这些结果是由测量方法引起的吗?实际上,该burnP6
进程从第一微秒开始就 100% 使用 CPU? :) 或者进程确实需要 1 到 2 秒才能获得所有 CPU 时间?
答案1
您用来显示 CPU 负载的命令正在紧密循环中运行,因此它与 CPUburn 竞争。如果您想观察 CPUburn 在没有竞争的情况下的 CPU 负载,请sleep 1
在循环中添加类似的内容。
在您的测试中,最初观察者循环获得几乎所有的 CPU,然后逐渐burnP6
获得越来越多的 CPU 份额。这是Linux 调度策略的结果。 Linux 内核有一个复杂的调度程序——实际上,它有很多调度算法,您可以配置在运行时使用哪些调度算法。阅读sched(7) 手册页如果您想深入了解更多细节,请参阅内核文档和参考书。
比我更有知识的人可以通过这个输出来判断哪个调度程序在您的系统上处于活动状态。我不能。我可以看到它优先ps | grep
于高 CPU 消耗者的 I/O 程序(循环,除了加载可执行文件、创建进程和传递数据之外什么都不做)。这在许多情况下都是有意义的:CPU 密集型程序可能不介意在计算上花费 1.1 秒而不是 1 秒,而 I/O 密集型程序通常是需要快速响应的用户界面线程或网络服务时间(低延迟)受到赞赏。显然有某种公平措施可以将平衡从占用所有 CPU 的进程组中推开。
尝试一下设置/proc/sys/kernel/sched*
并看看行为如何变化将会很有启发。