linux CPU 负载高问题分析方法
CPU
平均负载
平均负载含义
平均负载是指执行uptime后显示的Load Average(平均负载),单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
平均负载多少合理
当平均负载比cpu个数还大的时候,系统已经出现了过载。要综合三个不同时间间隔的平均值去比较。
平均负载与CPU使用率
平均负载和CPU使用率不能混为一谈,平均负载高了并不意味这CPU使用率就会变高。平均负载是单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程。
而CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应,比如:
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
如何分析平均负载过高问题
- CPU密集型进程
通过mpstat查看CPU使用率的变化情况:
-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
# -P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
$ mpstat -P ALL 5
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:30:06 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:30:11 all 50.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 49.95
13:30:11 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
13:30:11 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
可以看到有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。
再通过pidstat查询到哪个进程导致cpu使用率100%。
# 间隔 5 秒后输出一组数据
$ pidstat -u 5 1
13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command
13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress
-
I/O 密集型进程
同理,先通过mpstat查看usr和iowait的值,如果iowait比usr高,那说明是iowait的升高导致平均负载的升高。 -
大量进程的场景
通过pidstat查看进程情况,如果多个服务都在抢少量的cpu,并且wait值都比较高的话,说明每个进程等待cpu的时间都很高,最终导致cpu过载。