一、负载高
场景一:CPU密集型进程
第一个终端运行 stress 命令,模拟一个 CPU 使用率 100% 的场景
stress --cpu 1 --timeout 600
[root@iz2ze2w3v37sit3vf71kuez ~]# stress --cpu 1 --timeout 600
stress: info: [20859] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
在第二个终端运行 top 查看平均负载的变化情况
在第三个终端运行 mpstat 查看 CPU 使用率的变化情况:
mpstat -P ALL 5
-P ALL 表示监控所有cpu
5 表示间隔5秒输出一次数据
我的机器只有一个CPU。下图是一个多cpu截图(来源与网络
终端二中可以看到,1 分钟的平均负载会慢慢增加到 1.00,而从终端三中还可以看到,正好有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。
这说明,平均负载的升高正是由于 CPU 使用率为 100%
使用pidstat 来查询哪个进程在使用cpu:
场景二:IO密集型进程
1、加压stress -i 1 --timeout 600
[root@iz2ze2w3v37sit3vf71kuez ~]# stress -i 1 --timeout 600
stress: info: [21497] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd
2、top
3、mpstat 查看 CPU 使用率的变化情况
[root@iz2ze2w3v37sit3vf71kuez ~]# mpstat -P ALL 5
Linux 3.10.0-514.26.2.el7.x86_64 (iz2ze2w3v37sit3vf71kuez) 2021年08月17日 _x86_64_ (1 CPU)
13时41分08秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13时41分13秒 all 1.00 0.00 96.79 2.21 0.00 0.00 0.00 0.00 0.00 0.00
13时41分13秒 0 1.00 0.00 96.79 2.21 0.00 0.00 0.00 0.00 0.00 0.00
13时41分13秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13时41分18秒 all 0.80 0.00 96.38 2.82 0.00 0.00 0.00 0.00 0.00 0.00
13时41分18秒 0 0.80 0.00 96.38 2.82 0.00 0.00 0.00 0.00 0.00 0.00
4、查看哪个进程占用cpu
[root@iz2ze2w3v37sit3vf71kuez ~]# pidstat -u 5 1
Linux 3.10.0-514.26.2.el7.x86_64 (iz2ze2w3v37sit3vf71kuez) 2021年08月17日 _x86_64_ (1 CPU)
13时42分36秒 UID PID %usr %system %guest %wait %CPU CPU Command
13时42分41秒 0 253 0.00 0.80 0.00 0.00 0.80 0 kworker/0:1H
13时42分41秒 0 2270 0.20 0.20 0.00 0.00 0.40 0 AliSecGuard
13时42分41秒 0 13308 0.00 0.20 0.00 0.00 0.20 0 java
13时42分41秒 0 21498 0.20 91.00 0.00 1.60 91.20 0 stress
13时42分41秒 0 21578 0.00 0.20 0.00 0.00 0.20 0 pidstat
13时42分41秒 0 30350 0.40 0.40 0.00 0.80 0.80 0 AliYunDun
平均时间: UID PID %usr %system %guest %wait %CPU CPU Command
平均时间: 0 253 0.00 0.80 0.00 0.00 0.80 - kworker/0:1H
平均时间: 0 2270 0.20 0.20 0.00 0.00 0.40 - AliSecGuard
平均时间: 0 13308 0.00 0.20 0.00 0.00 0.20 - java
平均时间: 0 21498 0.20 91.00 0.00 1.60 91.20 - stress
平均时间: 0 21578 0.00 0.20 0.00 0.00 0.20 - pidstat
平均时间: 0 30350 0.40 0.40 0.00 0.80 0.80 - AliYunDun
案例分析
场景三:
1、加压
stress --cpu 1 --timeout 600
2、分析top命令
查看负载:
load average: 4.24, 3.49, 1.74
最近一分钟负载的值远远大于cpu个数,说明现在负载是高的。
15分钟平均负载为1.7. 5分钟平均负载为3.4。说明负载是最近几分钟涨起来的
负载=运行中的进程+就绪的进程+等待IO的进程
负载升高,我不能判断出到底是运行的进程导致的,还是IO导致的。
查看cpu:
%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
cpu满了,而 wa的值为0。可以推断出来,负载升高,是因为cpu升高导致的,而不是磁盘大量io导致的。
查看线程
top命令下,默认是按照cpu排序的,可以看出stress 进程消耗了大量的cpu。
同样也可以使用pidstat -u 来查看线程消耗cpu信息
pidstat -u 4
stress 进程在大量消耗cpu。
CPU 列的0,表示cpu的编号为0。(我的机器只有一个CPU)
使用vmstat 查看
R列:
表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,
说明CPU不足,需要增加CPU
B列:
表示在等待资源的进程数,比如正在等待I/O或者内存交换等
场景四:
1、加压
stress -i 1 --timeout 600
2、使用top命令分析