Linux-平均负载指数

系统平均负载

什么是平均负载

# 什么是平均负载
平均负载可以反映出,单位时间内,系统处于可运行状态和不可中断状态的进程数,也就是活跃进程数。
# 可运行状态的进程 STAT 对应 R
# 不可中断状态进程 STAT 对应 D
# 平均负载与CPU有关,但不止和CPU有关

平均负载多少合理

举个例子,当CPU核心数为 4 , 2 , 1 时,平均负载为 2 的意味着什么?

CPU核心数 平均负载 概念
4 2 50%的CPU已经被占用
2 2 100%的CPU已经被占用
1 2 只有50%的进程占用了CPU

如何观察平均负载

# load average: 0.00, 0.01, 0.05
0.00	 # 1 分钟的平均负载 占用 0% 的CPU以及其他资源
0.01	 # 5 分钟的平均负载 占用 1% 的CPU以及其他资源
0.05	 # 15 分钟的平均负载 占用 5% 的CPU以及其他资源
		 # 平均负载与CPU有关,但不止和CPU有关


# 例 1:
# 若系统平均负载为 load average: 5.00,2.00,1.00 ,那么最近 1 分钟的平均负载变大,说明系统的平均负载趋势为增高,需要检查系统进程运行情况

# 例 2:
# 若系统平均负载为 load average: 1.00,2.00,5.00 ,那么 15 分钟的平均负载较大,说明徐彤的平均负载趋势为减小,可以检查 15 分钟前的系统进程运行情况

# 例 3:
# 若系统平均负载为 load average: 2.00,2.00,2.00 ,那么平均负载很“稳定”(是否稳定观察CPU核心数而定)

# 一般情况下,平均负载高于 70% ,就需要调试(70%=平均负载/CPU总核心数)

平均负载和CPU的使用率的区别

平均负载:平均负载指的是每单位时间内,处于可运行状态和不可中断状态的进程数,所以,它不仅包括了正在使用CPU的进程数,还包括等待CPU和等待IO的进程数。

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

为了区分平均负载和CPU的使用率之间的区别,我们要引入CPU密集型任务和I/O密集型任务的概念

## 1. 举例 CPU密集型进程 和 IO密集型进程 
# CPU密集型进程(特点是要进行大量的计算,消耗CPU资源)
CPU密集型也叫计算密集型,CPU有很多运算和逻辑判断要处理,使用大量的CPU会导致平均负载升高。

# IO密集型进程(特点是99%的时间都花在I/O读写上,花在CPU上的时间很少)
IO密集型进程,等待IO也会导致平均负载升高,此时大部分时间的CPU状态是在等待I/O读写操作,CPU使用率不一定很高。



# 2. 举例 大量进程调度 
大量等待CPU的进程调度也会导致平均负载升高,此时的CPU使用率也会比较高。

平均负载分析

stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。

pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。

# 安装 stress 软件包 以及 sysstat 软件包
[root@wqh06 ~]# yum -y install stress sysstat

11.7.3版本的sysstat,pidstat命令结果中包含了wait占用的时间百分比,点击下载rpm包

执行CPU密集型任务

## 案例一 执行CPU密集型任务
# CPU密集型进程压力测试(使CPU满载利用)
[root@wqh06 ~]# stress --cpu 1 --timeout 500
stress: info: [7749] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# 查看平均负载指数
[root@wqh06 ~]# watch -d uptime
Every 2.0s: uptime                                                   
Wed Apr 22 19:11:27 2020
19:11:27 up  6:53,  3 users,  load average: 0.54, 0.17, 0.09
# 使用mpstat -u 5 1 所有CPUs的负载,使用 mpstat -P ALL 列出总体以及每个CPU的负载
[root@wqh06 ~]# mpstat -u 5 1
Linux 3.10.0-957.el7.x86_64 (wqh06) 	04/22/2020 	_x86_64_	(1 CPU)

07:24:25 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
07:24:30 PM  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:     all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
[root@wqh06 ~]# mpstat -P ALL 5 1
Linux 3.10.0-957.el7.x86_64 (wqh06) 	04/22/2020 	_x86_64_	(1 CPU)

07:27:37 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
07:27:42 PM  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
07:27:42 PM    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
# 使用pidstat -u 5 1 观察
[root@wqh06 ~]# pidstat -u 5 1
Linux 3.10.0-957.el7.x86_64 (wqh06) 	04/22/2020 	_x86_64_	(1 CPU)

07:24:32 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
07:24:37 PM     0      8634   99.40    0.00    0.00    0.60   99.40     0  stress
07:24:37 PM     0      8652    0.00    0.20    0.00    0.00    0.20     0  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0      8634   99.40    0.00    0.00    0.60   99.40     -  stress
Average:        0      8652    0.00    0.20    0.00    0.00    0.20     -  pidstat

执行I/O密集型任务

## 案例二 执行I/O密集型任务
# I/O密集型进程压力测试
[root@wqh06 ~]# stress --io 5 --timeout 500
stress: info: [8018] dispatching hogs: 0 cpu, 100 io, 0 vm, 0 hdd
# 查看平均负载指数
[root@wqh06 ~]# watch -d uptime
Every 2.0s: uptime                                                                                 Wed Apr 22 19:15:30 2020
19:47:09 up 6 min,  4 users,  load average: 4.09, 1.45, 0.57

### 注意:当运行命令 `stress --io 1000 --timeout 500` 时,会有 1000 个stress进程,平均负载指数会飙升,但CPU并不繁忙,运行一些指令也不会卡,也就是说I/O密集型任务会影响平均负载,但CPU利用率并不高


大量进程调度

## 案例三 大量进程调度
# 当前只有一个CPU核心,测试四个CPU核心的进程调度(给予四倍的活跃进程数)
[root@wqh06 ~]# stress --cpu 4 --timeout 500
stress: info: [8263] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
# 查看平均负载指数
[root@wqh06 ~]# watch -d uptime
Every 2.0s: uptime                                                                                 Wed Apr 22 19:15:30 2020
19:38:21 up  7:20,  3 users,  load average: 4.12, 3.09, 4.77

关于平均负载的总结

  • 1.平均负载高有可能是CPU密集型进程导致的
  • 2.平均负载高并不一定代表CPU的使用率就一定高,还有可能是I/O繁忙
  • 3.当发现负载高时,可以使用mpstat、pidstat等工具,快速定位到,负载高的原因,从而做出处理
原文地址:https://www.cnblogs.com/zzzwqh/p/12755682.html