CPU平均负载升高的三个排查角度
1 | yum install -y man-pages |

平均负载 == 平均活跃进程数 != cpu使用率
uptime:1 分钟、5 分钟、15 分钟的平均负载(Load Average)。

0.63 不是CPU的使用率,而是单位时间内,系统处于可运行和不可中断的平均线程数。也就是平均活跃进程数。
- 可运行:ps 显示的进程是R状态的,也就是Running或者Runnable状态的。
- 不可中断:ps 显示的进程是D状态的,也就是Disk sleep的进程。处于内核态的关键流程,不可中断,否则会出现磁盘和进程的数据不一致。此状态是系统对硬件和进程的的一种保护机制。
在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。
平均负载多少合理
查看CPU的个数
top 或者 grep 'model name' /proc/cpuinfo | wc -l

根据**系统负载趋势,当平均负载高于 CPU 数量 70% 的时候**,你就应该分析排查负载高的问题了。 一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。
eg: 在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那 么说明在过去 1 分钟内,系统有 73% 的超载,而在 15 分钟内,有 698% 的超载,从整体 趋势来看,系统的负载在降低。
平均负载和CPU的使用率不一样
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
查看平均负载 过载原因
查看CPU的实时状态
查看进程占用CPU的情况
查看线程占用CPU的情况
stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场 景。
1 | sudo yum install -y epel-release |
- sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。这个包的两个命令 mpstat 和 pidstat。
- mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以 及所有 CPU 的平均指标。
- pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上 下文切换等性能指标。
1 | yum install sysstat |
cpu 密集(运行CPU)–load average 状态之一
1 | # 模拟一个进程,CPU使用率100% |

pidstat -u 5 ,5s 一组数据查看进程的指标,看看是哪个进程导致的过载

IO密集(不可中断)–load average 状态之一
1 | # 模拟 I/O 压力,即不停地执行 sync:缓存刷入磁盘 |
使用
1 | watch -d uptime |
1 | mpstat -P ALL 5 |
可以看到load average 升高,此时CPU使用率不高,但是iowait的比例很高,所以是IO导致的,之后定位IO高的进程,
1 | # 间隔 5 秒后输出一组数据,-u 表示 CPU 指标 |
大量进程(等待CPU)–load average 状态之一
1 | # 8个进程 |

上图使用 pidstat -u 5可以看到,是进程太多,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 25%(之后会到达75%)。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。
