平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
什么是可运行状态进程?所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是处于 R 状态(Running 或 Runnable)的进程。
什么是不可中断状态的进程?不可中断状态的进程是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是牌 D 状态的进程。
判断系统负荷是否过重,必须理解load average的真正含义。首先,假设最简单的情况,你的电脑只有一个CPU,所有的运算都必须由这个CPU来完成。那么,我们不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过。明显这是个单行道。
- 系统负荷为0,说明大桥上一辆车也没有。
- 系统负荷为0.5,说明大桥一半的路段有车。
- 系统负荷为1.0,说明大桥的所有路段都有车,也就是说大桥已经"满"了。
- 系统负荷为2.0,说明等待上桥的车辆与桥面的车辆一样多。
总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。
上面假设的是 1 个 CPU 的情况,如果是 2 个 CPU 或更多 CPU 呢? 两个 CPU 意味着大桥是单行道是 2 车道的,负载到 2.0 才说明大桥已经满了。N 个 CPU 原理相同。
查看 CPU 负载一般通过 top 和 uptime 命令。
如下 top 输出格式:
[root@master ~]# top
top - 22:03:34 up 15 min, 1 user, load average: 0.27, 0.35, 0.46
Tasks: 144 total, 2 running, 142 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 2.1 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st
在这个输出结果中,第一行的 load average 就是表示平均负载。后面三个数字分别表示 1 分钟、5 分钟和 15 分钟。
如下 uptime 输出格式:
[root@master ~]# uptime
22:11:12 up 22 min, 1 user, load average: 0.15, 0.26, 0.37
这个输出结果和 top 是一样的。
大家可能会疑惑平均负载代表的是活跃进程数,那平均负载高了,不就意味着 CPU 使用率高吗?
这个问题我们还是要回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。
比如:
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的。
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高。
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
系统负荷的理想值是多少?负载达到 CPU 核数是理想值么?
这不一定。系统往往需要预留一点。一般定为 70%。当平均负载高于这个数值的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。
但 70% 这个数字并不是绝对的,推荐的方法,还是把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势。当发现负载有明显升高趋势时再去做分析和调查。