定义
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
- 可运行状态:是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。
- 不可中断状态:不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。
当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态。如果此时的进程被打断了,就容易出现磁盘数据与进程数据不一致的问题。所以,不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
阈值
当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。
场景模拟
场景一:CPU 密集型进程
模拟一个 CPU 使用率 100% 的场景,平均负载最高为1。
$ stress --cpu 1 --timeout 600
场景二:I/O 密集型进程
模拟 I/O 压力,即不停地执行 sync,负载为1.06。
$ stress -c 1 --timeout 600
场景三:大量进程的场景
模拟的是 8 个进程,系统过载平均负载高达 7.97。
$ stress -c 8 --timeout 600
总结
- CPU被一个进程经常占用,及CPU密集型应用,此时大部分时间仅有一个进程处理可运行状态,所以平均负载最高为1;
- 单个进程写操作较多,且数据量大,经常需要等待磁盘写入,该进程经常处于不可中断状态,负载超过1;
- 多个进程强制CPU,多个进程处于运行或等待的活跃状态,负载高达7.97。
进程较少的情况下,比较少出现负载高的情况,业务进程较多时,单个进程强制导致其他进程等待,可以导致负载升高。