平均负载不仅包括正在使用 CPU 的进程,还包括等待 CPU等待 I/O 的进程。

什么是平均负载

通常我们使用 top 或 uptime 命令,来查看系统负载情况时,都会关注 load average 这一参数,但实际上你真的理解这一参数后三个数字的含义吗?相当一部分人将平均负载简单理解为单位时间内的 CPU 使用率,其实不然。

1
2
root@zwx-virtual-machine:/# uptime
 11:06:40 up 1 day, 12 min,  1 user,  load average: 0.09, 0.04, 0.01

图中 load average 后的三个数字,依次是过去1分钟、5分钟、15分钟的平均负载(Load Average)。简单来说,它代表的是单位时间内,系统处于可运行状态不可中断状态的平均进程数,也就是平均活跃进程数,和 CPU 使用率并没有直接关系。

所谓可运行状态的进程,是指正在使用 CPU 或正在等待 CPU 的进程,也就是使用 ps 命令看到的处于 R/Running/Runnable 状态的进程。

不可中断的进程,是指正处于内核态关键流程中的进程,且这些流程是不可打断的,比如等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态进程。

平均负载多少算高

我们说平均负载是平均活跃进程数,显然平均的是活跃进程数,那么平均给谁呢?显然是指 CPU,所以评价平均负载需要参考 CPU 的数量。当平均负载值与 CPU 数量相等,就是最理想的负载状态。,比如平均负载为 4 时,意味着在有 4 个 CPU 的系统上,所有 CPU 都刚好被完全占用,在有 8 个 CPU 的系统上,50% 的 CPU 处于空闲状态,在有 2 个 CPU 的系统上,一半的进程没有竞争到 CPU。

此时,我们就可以初步判断,当平均负载比 CPU 个数大时,系统就已经出现过载。不过这还不够,平均负载有三个值,只参考某一个显然是不行的,就好比评估你一天的伙食,要综合早中晚三顿饭的质量才算客观,评估平均负载也要综合考虑三个值。

  • 这三个值分别代表 1 分钟、5 分钟、15 分钟的平均负载,如果三者基本相同,则说明系统负载较为平稳;
  • 如果 1 分钟的值远小于 15 分钟的值,则说明近 15 分钟内系统有较大负载但呈下降趋势;
  • 如果 1 分钟的值远大于 15 分钟的值,则说明最近 1 分钟内系统负载在增加,但这种增加可能临时的也可能是持续性的,因此对于这种情况需要持续观察。

举个例子

在一个单 CPU 系统上,通过 uptime 看到 load average:0.53,1.25,5.47,那么说明在过去 1 分钟内,系统有 47% 的空闲状态,5 分钟内有 25% 的过载,15 分钟内,系统有 447% 的过载,整体上来看系统的平均负载在降低。

我们都知道,负载过高,会导致进程响应变慢,进而影响服务的正常功能。那么,当平均负载达到什么程度时需要采取有效手段使其降低呢?参考大佬的经验,当平均负载高于 CPU 数量的 70% 时,就应该分析排查负载高的问题了。

小结

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,并不能直接发现瓶颈源头,因此,在理解平均负载时,也要注意一下几点:

  • 平均负载高,有可能是 CPU 密集型进程导致的;
  • 平均负载高,并不一定代表 CPU 使用率高,还可有能是 I/O 繁忙;
  • 当发现平均负载高时,可以使用 mpstat、pidstat 等工具,辅助分析负载来源。