每次服务故障或者服务器响应变慢,第一时间上服务器基本就是使用 top 或者 uptime 命令来查看系统的负载情况。
上图中load average就代表系统的负载,分别是过去 1 分钟、5 分钟、15 分钟的平均负载。
平均负载?啥意思?单位时间内的cpu使用率吗?有没一种熟悉又陌生的感觉?现在就一起来认识一下这个平均负载。
简单来说,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程。也就是ps命令中R状态的进程。不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,也就是ps 命令中 D 状态的进程。
所以我们可以简单认为平均负载其实是单位时间内的活跃进程数。基于这个理解,我们可以认为理想情况下每个 CPU 上都刚好运行着一个进程,每个 CPU 都得到充分利用。
比如上图平均负载为 4,在有4个CPU 的系统上,意味着所有的 CPU 都刚好被完全占用,在只有 1 个 CPU 的系统中,则意味着有3/4的进程竞争不到 CPU。
工作中,我们可能容易把平均负载和 CPU 使用率混在一起,但还是有必要区分一下。
我们说平均负载是单位时间内处于可运行状态和不可中断状态的进程数,也就是说这既包括了正在使用 CPU 的进程,还包括了等待 CPU 和等待 I/O 的进程。
而 CPU 使用率,是单位时间内 CPU的繁忙度,跟平均负载并不一定完全对应。
如果是CPU 密集型进程,使用大量 CPU 会导致平均负载升高,这个时候两者是一致的;如果是I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;如果有大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
平均负载最理想的情况是等于 CPU 个数。我们可以通过 top 命令或者从文件 /proc/cpuinfo 中读取系统有几个 CPU。
有了 CPU 个数,我们就可以判断出,当平均负载比 CPU 个数还大的时候,系统已经出现了过载。
但是平均负载有三个数值,怎么参考呢?
其实那三个平均值,给我们提供了分析系统负载趋势的数据,更全面、更立体。
如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内出现过负载大的情况,如果远超出cpu个数,有必要或许就要去分析一下服务器的相关日志来检查一下。
如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,需要持续观察。一旦 1 分钟的平均负载超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,然后去优化。
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。