从根上理解平均负载

143 阅读5分钟

你正在悠闲的摸鱼,突然报警群里传出来,某服务器负载升高。

Leader让你看下这台服务器的负载。

你登录上服务器把 CPU使用率的截图发给Leader ,说负载不是很高。

Leader发来了三个省略号,说让你发的是平均负载不是CPU使用率。

那么,究竟什么是平均负载,平均负载和CPU使用率有着什么关系?

平均负载是指单位时间内,处在可执行状态和不可中断睡眠状态的进程的平均数。也就是说,它包括了处在执行态,就绪态和阻塞态的进程

其中,可执行状态的进程包括正在被CPU执行的进程以及在就绪队列上等待CPU执行的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程(也就是进程的三个基本状态中的执行态和就绪态)

而不可中断睡眠状态的进程即指处于内核关键流程中的进程,并且这些流程不可被打断。比如最常见的就是等待硬件设备的I/O响应。也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。

Linux系统可以输入uptime/top命令查看系统平均负载,

root@hecs-163858:~# uptime 15:54:19 up 126 days, 22:25, 2 users, load average: 0.00, 0.02, 0.00

0.00, 0.02, 0.00 分别是系统最近1 分钟、5 分钟、15 分钟的平均负载。

如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。

这里我再举个例子,假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那么说明在过去 1 分钟内,系统有 73% 的超载,而在 15 分钟内,有 698% 的超载,从整体趋势来看,系统的负载在降低。如果是双CPU ,那么说明在过去 1 分钟内没有超载,而在 15 分钟内,有 598% 的超载,从整体趋势来看,系统的负载也是在降低

那么平均负载高就意味着CPU使用率高吗?

回到平均负载的含义上来,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。

比如:

(1)CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;

(2)I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;

(3)大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

从案例中说明这三种情况:

首先 安装测试工具 stress和性能查看工具sysstats

apt install stress sysstat

sysstat主要使用两个命令:mpstat和pidstat

mpstat:多核CPU性能分析工具 用来查看每个CPU的 性能指标以及所有CPU平均指标

pidstat 进程性能分析工具,用来试试查看cpu 内存 io以及上下文切换性能指标

(1)模拟第一种情况:CPU密集任务导致CPU使用率升高从而导致平均负载升高

压测命令:stress --cpu 1 --timeout 600

uptime查看负载变化:

可以看到平均负载持续升高。

继续查看CPU使用率 mpstat -P ALL 5 (-P ALL表示监控所有CPU)

看到一个CPU使用率是100 ,而iowait是0 说明是CPU升高导致了系统平均负载的升高。

通过使用pidstat可以查看到具体是哪个进程导致CPU升高

pidstat -u 5 1

可以看到是stress这个进程。

(2)模拟第二种情况:I/O密集进程导致平均负载升高

压测命令:stress -i 1 --timeout 600

uptime查看负载变化:

可以看到平均负载持续升高。

mpstat -P ALL 5 查看CPU的状态

可以看到CPU的IO值较高,但是%usr使用率并不高。说明是IO升高导致了系统平均负载的升高。

pidstat -u 5 1 可以看到是stress进程的IO较高

(3)模拟第三种情况:CPU执行了大量进程(远超出CPU核数)从而导致平均负载升高

压测命令 我们还是使用 stress,但这次模拟的是 8 个进程

stress -c 8 --timeout 600

可以看出,8 个进程在争抢 2 个 CPU,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 74%。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

最后总结一下:

平均负载指的是平均活跃进程数,即可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

理解平均负载时,也要注意:平均负载高有可能是 CPU 密集型进程导致的;平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;执行大量进程也会导致系统平均负载升高

当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源。

参考《Linux性能优化实战》