Getting Started With Load Average 2014-06-15
what
-
什么是Load Average
Load是计算机工作量的度量。Load Average就是一段时间内(1分钟,5分钟,15分钟)系统Load的平均值。简单来说,就是一段时间内(1分钟,5分钟,15分钟)运行队列里等待的进程数加上当前正在执行的进程数。
可以通过uptime命令查看。
uptime 21:45 up 22:37, 3 users, load averages: 1.81 1.79 1.58
-
哪些进程被统计在内
一个空闲的计算机load值为0,每一个使用或者等待CPU的进程使Load值增1。大多数UNIX系统仅仅计算处于正在运行或者等待运行(running or runnable)状态的进程。但是Linux同样包括处于不可中断(uniterruptible)状态的进程(通常是等待I/O),如果系统上有许多进程因为I/O繁忙被阻塞会导致不同的结果。这样的情况下Load Average会很高,但不能反应CPU实际使用增加(可能CPU使用率会很低,但是依然反应出用户需要等待多长时间)。
-
是统计进程还是线程
在现代操作系统中,对线程的不同实现导致Load Average计算的不同。这实际是跟不同线程模型相关的。为了计算Load一些系统视线程为进程:那么每个等待的线程都会使Load值增1。但是其他系统可能不同,尤其是对于实现M:N这种线程模型的系统通常使用不同的策略,对于Load计算有的是按照每个进程恰好一次(无论线程数量),有的是仅仅计算用户线程调度器暴露给内核的线程数(这可能取决于处理器的并发量)。Linux系统应该是每个线程单独Load增1。
-
一个类比
明白上述两点就知道了Load计算的实体是什么,关键是针对不同的系统有不同的实现。对于Load的理解,在这篇文章中有个通俗的解释。
一只单核的处理器可以比喻成一条单车道。设想你是这条道路的交警,你来规划车辆怎么通过。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。 如果车辆众多,那么需要告诉他们稍等一会。
于是,对于车流情况有特定的描述,例如:
0.00 表示目前道路上没有任何的车流。 实际上这种情况与 0.00 到 1.00 之间是相同的,很通畅,过往的车辆可以丝毫不用等待的通过。
1.00 表示刚好是在这条道路的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。
超过 1.00,那么说明这条道路已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这条道路基本上已经快承受不了,还有超出道路负载两倍多的车辆正在等待通过。
-
两个比较
Load Average是系统负荷的重要度量指标,另一个同样经常被使用的则是CPU使用率。这里简单的进行比较。
- Load Average度量的是CPU使用的趋势,而不像CPU使用率那样是瞬时快照
- Load Average包含了所有对CPU的需求,而不仅仅是度量时间点的活跃程度
对于均衡负载来说,基于CPU队列长度的CPU Load信息会比CPU使用率更好。原因大概是对于Load很高的主机,CPU使用率可能接近100%,这时的利用率不能反应负载的级别。相反,CPU队列长度能直接反应这个CPU的负载总量。一个简单的例子就是:对于两个不同的系统,一个有3个进程在等待队列一个有6个进程在队列,它们的CPU利用率都可能接近100%。
对于CPU利用率和CPU Load Average的结果来判断性能问题。首先低CPU利用率不表明CPU不是瓶颈,竞争CPU的队列长期保持较长也是CPU超负荷的一种表现。对于应用来说可能会去花时间在I/O,Socket等方面,那么可以考虑是否后这些硬件的速度影响了整体的效率。