了解顶部和平均负载

Gab*_*ber 14 cpu process top load

我在所有三个负载字段中观察到某台机器(大约 9)上的高负载平均值。我将负载理解为处于“运行”状态/当前需要 CPU 时间的进程数。我的推理是否正确,如果 N 个进程在我的机器上运行,这不会产生大于 N 的负载?

此外,负载是否与进程或线程有关?换句话说,多线程进程能否产生大于 1 的负载?

gel*_*aen 8

平均负载通常被描述为“运行队列的平均长度”。因此,很少有 CPU 消耗进程或线程可以将 LA 提高到 1 以上。如果 LA 小于 CPU 内核总数,则没有问题。但是如果它高于 CPU 的数量,这意味着一些线程/进程将留在队列中,准备运行,但等待空闲的 CPU。


小智 5

用于计算负载平均值的数字是处于运行或不可中断状态的任务以及在移动平均值的时间片内完成的工作量。这些任务可以是多线程进程的一部分。由于所用算法的平滑结果,字段越往后越模糊。

负载为 1 等于 100% 的 CPU 工作价值。如果您有一个多线程应用程序,该应用程序的活动线程数量超过了可用 CPU 的数量,那么您可以让单个进程将负载驱动到 1 以上。这可能是一个短期峰值,不会反映在平均负载的较长时间片视图。

此外,由于平均负载是在多核系统出现之前开发的,因此将负载数除以可用内核总数很重要。如果这是 4 插槽四核系统上 9 的持续负载,那么这是 16 个负载中的 9,并不是真正的问题。


vk5*_*5tu 5

请参阅kernel/sched/loadavg.c,它在开头有一个长而出色的注释,解释了从可运行线程数(“运行队列”)的指数衰减平均值加上不可中断线程数(等待线程数)得出的平均负载。 I/O 上或等待锁)。

以下是评论的实质内容,但值得完整阅读:

 * The global load average is an exponentially decaying average of
 * nr_running + nr_uninterruptible.
 *
 * Once every LOAD_FREQ:
 *     nr_active = 0;
 *     for_each_possible_cpu(cpu)
 *         nr_active += cpu_of(cpu)->nr_running +
 *                      cpu_of(cpu)->nr_uninterruptible;
 *     avenrun[n] = avenrun[0] *
 *                  exp_n + nr_active *
 *                  (1 - exp_n)
Run Code Online (Sandbox Code Playgroud)

现实生活使代码有些复杂:每个 CPU 计数器、无滴答内核、热插拔 CPU、缺乏需要 exp(n) 定点实现的浮点代码。但很容易看出,这些都在努力忠实地实现评论中描述的方法。

您会注意到 Linux 计算线程数,而不仅仅是进程数,这回答了您的问题。