Linux性能优化(一):平均负载

131 阅读1分钟

什么是平均负载

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,可以理解为平均活跃的进程数量。它和CPU使用率并没有直接关系

  • 可运行状态的进程:正在使用CPU或者就绪状态的进程(ps命令查看时,处于R状态的进程)

image.png

  • 不可中断的进程:处于内核关键操作中的进程,并且这些操作不可以被打断的。通常是等待硬件设备I/O响应。(ps命令查看时,处于D状态的进程)

image.png

如何判断平均负载是否合理

Linux下面,使用如下命令查看平均负载情况,或者使用top命令查看也可以

$ uptime
21:47:19 up 7 min,  3 users,  load average: 0.23, 0.23, 0.12

比较值得关注的是load average: 0.23, 0.23, 0.12这部分,按照从左往右的顺序,依次表示过去1分钟、5分钟和15分钟的平均负载值。 平均负载最完美的情况,是数值非常接近CPU核心数量。所以还需要查看CPU核心数量,才能分析出当前平均负载是过大?还是过小?还是刚好合适。可以使用lscpu命令进行查看CPU核心数量:

image.png 得到了CPU核数,再结合当前平均负载数值:

  • 当平均负载大于CPU核数,此时系统处于过载
  • 当平均负载等于CPU核数,意味着负载均衡
  • 当平均负载小于CPU核数,表示系统比较空闲

而对于1分钟、5分钟和15分钟的平均负载值:

  • 三个值基本相同,说明系统负载平稳
  • 1分钟值远小于15分钟值,说明近1分钟负载在减少,而过去15分钟却有很大的负载
  • 如果1分钟值远大于15分钟的值,说明近1分钟负载增加。这种增加可能是临时性的,也可能继续持续下去,所以要持续再观察。

一旦1分钟的平均负载接近或者超过了CPU核心数,意味着系统正在发生过载问题,此时需要结合实际场景,进行分析调查,然后根据结果进行优化。

平均负载与CPU使用率

结合上文已知,平均负载是指单位时间内,处于运行状态和不可中断的进程的数量。它不仅包含了正在使用CPU的进程,还包括等待CPU的进程、等待I/O的进程。 而CPU使用率,是指单位时间内,CPU繁忙情况统计,跟平均负载不一定完全对应。例如:

  • CPU密集型,使用大量CPU会导致平均负载升高,此时两者是一致的
  • I/O密集型,等待I/O也会导致平均负载很高,但是此时CPU使用率不一定很高
  • 大量等待CPU的进程调度也会导致平均负载很高,此时CPU使用率也会比较高

平均负载案例分析

本次案例是基于Debian内核的Ubuntu20.04进行的,系统配置如下:

image.png 使用的压测工具是stress;性能工具是sysstat

案例一:模拟CPU密集型进程

首先启动一个终端,运行:

$ stress --cpu 2 --timeout 600 # 使用两个CPU核心;600表示运行600s

image.png 然后新打开一个终端,查看负载变化情况:

$ watch -d uptime # -d 参数表示高亮显示变化的区域

image.png 从上图可以很清晰的看到,负载逐渐上升 再新起一个终端,然后查看CPU使用率变化

$ mpstat -P ALL 5 1 # -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据

image.png

可以看到,有两个核心的CPU使用率都是100%,但是iowait都是只有0,说明负载升高是由于大量使用CPU,然后CPU使用率升高导致的。

如果想要进一步查看是具体那个进程导致了CPU使用率升到100%,可以使用如下命令:

$ pidstat -u 5 1 #间隔5秒后输出一组数据

image.png 不难看出,就是我们测试工具启动的进程导致的。