想要知道怎么排查,先看哪些因素会影响到平均负载,然后逐一排查。
平均负载的定义:处于运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
1、判断平均负载合理性
(1)系统负载和CPU总数(逻辑总数)的关系,过载情况:load average > CPU 总数
(2)查看系统平均负载
$ top
top - 21:52:21 up 386 days, 4:10, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 164 total, 1 running, 163 sleeping, 0 stopped, 0 zombie
或
$ uptime
21:53:01 up 386 days, 4:11, 1 user, load average: 0.00, 0.00, 0.00 # 依次表示1min, 5min,15min平均负载
(3)查看系统的CPU总数
$ grep 'model name' /proc/cpuinfo
model name : QEMU Virtual CPU version (cpu64-rhel6)
model name : QEMU Virtual CPU version (cpu64-rhel6)
model name : QEMU Virtual CPU version (cpu64-rhel6)
model name : QEMU Virtual CPU version (cpu64-rhel6)
$ grep 'model name' /proc/cpuinfo|wc -l
4
(4) 结合(2)中1min, 5min, 15min负载情况判断负载是在增加还是减少
1min负载>5min负载>15min负载 负载在增加
1min负载<5min负载<15min负载 负载在减少
(5) 当负载高于CPU总数80%时就要排查原因了
2、通过步骤1如果已经确定了负载很高,如何排查?
负载增加或者很大时,CPU使用率可能在相同区间内增加,但有时未必,为什么呢?
还是回归到定义,平均负载:单位时间内处于运行状态和不可中断状态的进程数(中断有CPU中断和IO中断);CPU使用率:单位时间内CPU处理进程情况统计。所以,平均负载还包括了正在运行使用的CPU进程,等待CPU和等待I/O的进程。
用到的命令:mpstat pidstat(sudo yum install sysstat或sudo apt-get install sysstat安装命令)
(1)$ watch -d uptime #查看负载变化
Every 2.0s: uptime Sun Jan 6 23:54:40 2019
23:54:40 up 387 days, 6:13, 1 user, load average: 0.01, 0.01, 0.00
(2)$ mpstat -P ALL 5 1 #查看CPU性能指标,并每隔5s输出1组数据
Linux 2.6.32-696.16.1.el6.x86_64 (XXX-hostname-000) 01/06/2019 _x86_64_ (4 CPU)
11:55:25 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
11:55:30 PM all 2.20 0.00 1.25 0.00 0.00 0.30 0.10 0.00 96.15 #总的cpu情况
11:55:30 PM 0 2.79 0.00 2.00 0.00 0.00 0.60 0.20 0.00 94.41 #逻辑cpu0的情况
11:55:30 PM 1 2.40 0.00 1.20 0.00 0.00 0.20 0.00 0.00 96.20
11:55:30 PM 2 2.00 0.00 1.00 0.00 0.00 0.20 0.00 0.00 96.81
11:55:30 PM 3 1.80 0.00 1.00 0.00 0.00 0.40 0.00 0.00 96.79
通过上面两步,判断负载升高时,%usr,%iowait 是否升高。
场景a) %usr高 CPU使用率超过80%,考虑扩容
场景b) %iowait 高,CPU不高 判断是否存在大量的磁盘IO操作,批量查询或者写入,大的json。
针对上面2种情况,使用pidstat找出对应的进程:
$ pidstat -u 5 1 #5s输出1组进程数据
Linux 2.6.32-696.16.1.el6.x86_64 (XXX-hostname-000) 01/06/2019 _x86_64_ (4 CPU)
11:57:57 PM PID %usr %system %guest %CPU CPU Command
11:58:02 PM 1383 0.00 0.20 0.00 0.20 3 xxx
11:58:02 PM 3961 1.00 1.40 0.00 2.40 0 xxx
11:58:02 PM 4048 0.20 0.00 0.00 0.20 2 xxx
11:58:02 PM 8473 0.00 0.20 0.00 0.20 1 java
11:58:02 PM 20394 1.60 0.00 0.00 1.60 2 php
场景c) 大量进程情况
$ pidstat -u 5 1
14:23:25 UID PID %usr %system %guest %wait %CPU CPU Command
14:23:30 0 3190 25.00 0.00 0.00 74.80 25.00 0 stress
14:23:30 0 3191 25.00 0.00 0.00 75.20 25.00 0 stress
14:23:30 0 3192 25.00 0.00 0.00 74.80 25.00 1 stress
14:23:30 0 3193 25.00 0.00 0.00 75.00 25.00 1 stress
14:23:30 0 3194 24.80 0.00 0.00 74.60 24.80 0 stress
14:23:30 0 3195 24.80 0.00 0.00 75.00 24.80 0 stress
14:23:30 0 3196 24.80 0.00 0.00 74.60 24.80 1 stress
14:23:30 0 3197 24.80 0.00 0.00 74.80 24.80 1 stress
14:23:30 0 3200 0.00 0.20 0.00 0.20 0.20 0 pidstat
可以看出,8 个进程在争抢 2 个 CPU,每个进程等待 CPU时间高达25%,超出了CPU计算能力的进程最终导致CPU过载。
当然,还有一种情况CPU使用高了,负载并不高,考虑是单个进程引起,定位问题进程,请参考:https://blog.youkuaiyun.com/wangtingting_100/article/details/80666709
总结下,负载升高可能是CPU升高引起的,也可能是IO等待引起的。CPU升高可能是大流量引起的,也可能某个进程导致的。
注:学习倪朋飞老师性能优化课程总结。