问题
我们经常使用linux的top命令或uptime命令,来查看os的平均负载,类似如下:
$ uptime
02:27:16 up 11:14, 1 user, load average: 0.00, 0.01, 0.00
这个load average平均负载,具体是什么意思?
3个数含义
平均负载是指1分钟,5分钟,15分钟时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。实际上就是1分钟,5分钟,15分钟内,平均活跃进程数。
cpu核数
lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 6
这个CPU(s):
就是表示这个台电脑的cpu核数。
这样基于,上面两个指标,就可以知道cpu利用率是多少了。
cpu密集型场景
# 使用stress命令制造1进程,进行复杂计算,600秒后停止
stress --cpu 1 --timeout 600
stress: info: [24183] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
# uptime观察实时平均负载
watch -d uptime
Every 2.0s: uptime ubuntu: Mon May 29 06:32:38 2023
06:32:38 up 15:19, 4 users, load average: 0.55, 0.68, 0.47
# 使用mpstat观察所有CPU运行状态,每5秒报告一次
mpstat -P ALL 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:33:02 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:33:07 AM all 16.68 0.00 0.03 0.07 0.00 0.13 0.00 0.00 0.00 83.08
06:33:07 AM 0 0.00 0.00 0.20 0.20 0.00 0.40 0.00 0.00 0.00 99.20
06:33:07 AM 1 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.00 0.00 99.60
06:33:07 AM 2 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80
06:33:07 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
06:33:07 AM 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:33:07 AM 5 0.00 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.80
# 从mpstat报告可以知道4号CPU的存在用户进程达到了100%
# 使用pidstat命令观察进程占用CPU的使用情况,每5秒报告一次
pidstat -u 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:35:16 AM UID PID %usr %system %guest %wait %CPU CPU Command
06:35:21 AM 0 2111 0.20 0.00 0.00 0.00 0.20 5 containerd
06:35:21 AM 1000 25471 100.00 0.00 0.00 0.00 100.00 4 stress
06:35:21 AM 1000 25515 0.00 0.20 0.00 0.00 0.20 3 watch
# 从报告中可以知道stress进程,在4号CPU上面使用率达到了100%
io密集型场景
# 使用stress命令制造1个进程不对队磁盘进程IO操作,从而制造IO密集型场景,600秒后停止
stress -i 1 --timeout 600
# 观察实时平均负载
watch -d uptime
# 使用mpstat观察所有CPU运行状态,每5秒报告一次
mpstat -P ALL 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:43:42 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:43:47 AM all 0.03 0.00 1.41 14.45 0.00 0.03 0.00 0.00 0.00 84.07
06:43:47 AM 0 0.00 0.00 0.00 0.00 0.00 0.20 0.00 0.00 0.00 99.80
06:43:47 AM 1 0.00 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.60
06:43:47 AM 2 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80
06:43:47 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
06:43:47 AM 4 0.00 0.00 7.01 78.98 0.00 0.00 0.00 0.00 0.00 14.01
06:43:47 AM 5 0.00 0.00 1.41 11.47 0.00 0.00 0.00 0.00 0.00 87.12
# 从报告中可以知道4号CPU中存在78.98%io等待。
# 使用pidstat命令观察进程占用CPU的使用情况,每5秒报告一次
pidstat -u 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:45:30 AM UID PID %usr %system %guest %wait %CPU CPU Command
06:45:35 AM 0 206 0.00 1.20 0.00 0.00 1.20 5 kworker/5:1H-kblockd
06:45:35 AM 0 256 0.00 2.00 0.00 0.00 2.00 4 kworker/4:1H-kblockd
06:45:35 AM 0 2111 0.00 0.20 0.00 0.00 0.20 5 containerd
06:45:35 AM 0 2990 0.00 0.20 0.00 0.00 0.20 5 kworker/5:2-events
06:45:35 AM 1000 26459 0.00 9.58 0.00 3.19 9.58 4 stress
# pidstat报告中可以知道4号cpu上面wait最大为3.19%,是stress进程
cpu争夺场景
# 这里创造24个进程,600秒后停止
stress -c 24 --timeout 600
# 因为这里测试的机器有6个核数,基于此数据,我创造4倍的进程数,来发起一群进程cpu争夺战
# 观察实时平均负载
watch -d uptime
# 使用mpstat观察所有CPU运行状态,每5秒报告一次
mpstat -P ALL 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:53:45 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:53:50 AM all 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:53:50 AM 5 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# 这次每个cpu的用户进程使用率都100%
# 使用pidstat命令观察进程占用CPU的使用情况,每5秒报告一次
pidstat -u 5
Linux 5.15.0-71-generic (ubuntu) 05/29/2023 _aarch64_ (6 CPU)
06:55:03 AM UID PID %usr %system %guest %wait %CPU CPU Command
06:55:08 AM 0 60 0.00 0.20 0.00 0.00 0.20 1 kcompactd0
06:55:08 AM 0 346 0.00 0.20 0.00 0.00 0.20 2 kworker/2:2-events
06:55:08 AM 0 2111 0.00 0.20 0.00 0.00 0.20 5 containerd
06:55:08 AM 0 17092 0.00 0.20 0.00 0.00 0.20 0 irqbalance
06:55:08 AM 1000 27466 24.90 0.00 0.00 74.90 24.90 2 stress
06:55:08 AM 1000 27467 24.90 0.00 0.00 75.10 24.90 2 stress
06:55:08 AM 1000 27468 24.90 0.00 0.00 74.70 24.90 4 stress
06:55:08 AM 1000 27469 24.90 0.00 0.00 74.50 24.90 1 stress
06:55:08 AM 1000 27470 24.90 0.00 0.00 74.50 24.90 1 stress
06:55:08 AM 1000 27471 25.10 0.00 0.00 74.70 25.10 3 stress
06:55:08 AM 1000 27472 24.90 0.00 0.00 74.70 24.90 5 stress
06:55:08 AM 1000 27473 24.70 0.00 0.00 74.90 24.70 0 stress
06:55:08 AM 1000 27474 24.90 0.00 0.00 74.50 24.90 3 stress
06:55:08 AM 1000 27475 24.90 0.00 0.00 74.90 24.90 1 stress
06:55:08 AM 1000 27476 24.90 0.00 0.00 74.50 24.90 0 stress
06:55:08 AM 1000 27477 24.90 0.00 0.00 74.70 24.90 4 stress
06:55:08 AM 1000 27478 24.90 0.00 0.00 74.90 24.90 5 stress
06:55:08 AM 1000 27479 25.10 0.00 0.00 75.30 25.10 4 stress
06:55:08 AM 1000 27480 24.90 0.00 0.00 74.70 24.90 5 stress
06:55:08 AM 1000 27481 24.90 0.00 0.00 74.90 24.90 4 stress
06:55:08 AM 1000 27482 24.90 0.00 0.00 74.50 24.90 2 stress
06:55:08 AM 1000 27483 24.90 0.00 0.00 74.90 24.90 3 stress
06:55:08 AM 1000 27484 24.90 0.00 0.00 74.90 24.90 1 stress
06:55:08 AM 1000 27485 24.90 0.00 0.00 74.70 24.90 3 stress
06:55:08 AM 1000 27486 24.70 0.00 0.00 74.50 24.70 2 stress
06:55:08 AM 1000 27487 24.90 0.00 0.00 74.90 24.90 5 stress
06:55:08 AM 1000 27488 24.90 0.00 0.00 75.10 24.90 0 stress
06:55:08 AM 1000 27489 25.10 0.00 0.00 75.10 25.10 0 stress
# 从pidstat报告中可以知道等待cpu时间的都基本上达到了75%,都是stress进程在那里等
总结
当平均负载高于CPU数量70%的时候,就需要进行高负载问题排查了。