一般我们排查系统变慢的问题时候,会执行uptime或者top命令,来查看操作系统的负载:

1
2
3
4
5
6
$ uptime
21:13:31 up 23 min,  1 users,  load average: 0.52, 0.58, 0.59

$ top
top - 21:13:31 up 23 min,  1 users,  load average: 0.52, 0.58, 0.59
...

uptime和top命令的第一行输出都是一样的,分别是系统当前时间、系统已经运行的时间、当前登录用户数以及系统平均负载。而系统平均负载又分为三个数值,分别表示系统过去1分钟、5分钟、15分钟的平均负载。

含义

那么平均负载到底代表什么呢?我们使用man uptime命令查看一下:

1
2
3
4
5
System load averages is the average number of processes that are either in a runnable or uninterruptable state.  A  process  in  a
runnable  state  is  either  using  the CPU or waiting to use the CPU.  A process in uninterruptable state is waiting for some I/O
access, eg waiting for disk.  The averages are taken over the three time intervals.  Load averages are not normalized for the num‐
ber  of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means
it was idle 75% of the time.

官方解释指出,系统平均负载就是单位时间内系统中处于runnable和uninterruptable状态的平均进程数。

  • runnable状态

    可运行状态,指这个进程正在使用cpu或者在等待cpu,我们使用ps命令看到的处于R状态的进程。

  • uninterruptable状态

    不可中断状态,指这个进程正处于内核态关键流程,不可被中断,最常见的就是处于等待I/O状态,我们使用ps命令看到的处于D状态的进程。

为了便于系统快速计算,实际上平均负载是活跃进程数的指数衰减平均值,我们可以简单理解为,平均负载其实就是平均活跃进程数。系统平均负载并没有对系统的cpu个数进行归一化,所以和CPU使用率并没有直接关系。

如果系统平均负载是2,意味着:

  • 在1个cpu的系统中,有一半的进程竞争不到cpu

  • 在2个cpu的系统中,所有的cpu刚好被占用

  • 在4个cpu的系统中,cpu有50%的空闲

如何分析

所以,我们不能光凭系统平均负载就来判断系统的是否负载过高或者过低。首先我们需要知道有几个cpu:

1
$ grep 'model name' /proc/cpuinfo | wc -l

平均负载最理想的情况就是正好等于CPU个数,当平均负载比CPU个数大时,系统就出现了过载。之后,我们就可以通过分析1分钟、5分钟、15分钟的平均负载,来了解当前系统的负载变化趋势。

使用平均负载超过或者低于CPU数量多少作为依据,来判断系统平均负载是否正常,参考价值不大。最好的方法是监控正常状态下的系统平均负载,根据历史数据来判断当前负载是否正常,如果不正常,再通过其他相关的分析程序来分析原因。

和CPU使用率关系

系统平均负载和CPU使用率没有直接的关系,系统平均负载不仅包括了正在使用CPU的程序,还包括了等待CPU和等待I/O的程序。而CPU使用率是单位时间内CPU繁忙状况的统计,对于不同类型的程序,和平均负载的不一定完全对应:

  • CPU密集型

    CPU大量时间都在运行,一般平均负载会升高,CPU使用率也会升高

  • I/O密集型

    大量等待I/O也会导致平均负载升高,但是CPU使用率不一定高

此外,如果有大量等待CPU调度的进程,也会导致平均负载升高,同时CPU使用率也会升高。