了解顶部和平均负载

了解顶部和平均负载

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

另外,负载是否针对进程或线程进行计数?换句话说,多线程进程可以产生大于1的负载吗?

答案1

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

答案2

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

负载 1 等于 1 个 CPU 工作量的 100%。如果您有一个多线程应用程序,并且设法使活动线程数超过可用 CPU 数,那么您可能有一个进程将负载驱动到高于 1。这可能是一个短期峰值,并且不会反映在平均负载的较长时间切片视图。

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

答案3

内核/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)

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

您会注意到 Linux 很重要线程,而不仅仅是流程,这回答了您的问题。

答案4

即时负载:正在运行或等待运行的任务数量,或者换句话说,愿意运行的任务数量

负载平均值:上面的度量,但与相同度量的先前样本呈指数平均

这两个数字都是无界的,并且通常比 N 大得多。

需要明确的是:Linux 上的负载计数包括线程,这是毫无疑问的。您可以使用创建许多线程的单个进程产生任意大的负载。

更多相关内容请点击此处

http://blog.angulosolido.pt/2015/04/linux-load-average-definitive-summary.html

相关内容