我在所有三个负载字段中都观察到某台计算机(大约9个)上的平均负载较高。我将负载理解为处于“运行”状态/当前需要CPU时间的进程数。如果机器上正在运行N个进程,那么我的推论是正确的吗?
另外,负载是否涉及进程或线程?换句话说,多线程进程会产生大于1的负载吗?
我在所有三个负载字段中都观察到某台计算机(大约9个)上的平均负载较高。我将负载理解为处于“运行”状态/当前需要CPU时间的进程数。如果机器上正在运行N个进程,那么我的推论是正确的吗?
另外,负载是否涉及进程或线程?换句话说,多线程进程会产生大于1的负载吗?
Answers:
用于计算平均负载的数字是处于运行或不间断状态的任务,以及在移动平均值的时间范围内完成的工作量。这些任务可以是多线程进程的一部分。由于所用算法的平滑结果,这些字段在时间上越早越模糊。
负载1等于一个CPU的工作量的100%。如果您有一个多线程应用程序,其活动线程的数量超过了可用CPU的数量,则可能只有一个进程将负载驱动到1以上。这可能是短期的高峰,并且不会反映在较长时间的平均负载视图。
同样,由于平均负载是在多核系统之前开发的,因此将负载数除以可用总核数非常重要。如果这是4插槽四核系统上的9的持续负载,那么这是16的9的负载,并不是真正的问题。
请参阅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)
现实生活使代码有些复杂:每CPU计数器,无滴答内核,热交换CPU,缺少浮点代码,因此需要对exp(n)进行定点实现。但是,很容易看出这些都在努力忠实地实现注释中描述的方法。
您会注意到,Linux会计数线程,而不仅仅是进程,线程会回答您的问题。
即时负载:正在运行或正在等待运行的任务数,或者通过其他方式,愿意运行的任务数
平均负载:以上量度,但与同一量度的先前样本呈指数平均
这两个数字都是无界的,并且通常比N大得多。
需要明确的是:Linux上的负载计数包括线程,这是毫无疑问的。您可以通过创建多个线程的单个进程来产生任意大的负载。
在这里更多
http://blog.angulosolido.pt/2015/04/linux-load-average-definitive-summary.html