进程使用CPU需要时间吗?

进程使用CPU需要时间吗?

我有一台单核 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*并看看行为如何变化将会很有启发。

相关内容