CPU平均负载升高的三个排查角度
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 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场 景。
sudo yum install -y epel-release
sudo yum install -y stress
- sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。这个包的两个命令 mpstat 和 pidstat。
- mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以 及所有 CPU 的平均指标。
- pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上 下文切换等性能指标。
yum install sysstat
cpu 密集(运行CPU)--load average 状态之一
# 模拟一个进程,CPU使用率100%
stress --cpu 1 --timeout 600

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

IO密集(不可中断)--load average 状态之一
# 模拟 I/O 压力,即不停地执行 sync:缓存刷入磁盘
stress -i 1 --timeout 600
# iowait 无法升高的问题,是因为案例中 stress 使用的是 sync()系统调用,
# 它的作用是刷新缓冲区内存到磁盘中。对于新安装的虚拟机,缓冲区可能比较小,
#无法产生大的 IO 压力,这样大部分就都是系统调用的消耗了。
#所以,你会看到只有系统 CPU 使用率升高。解决方法是使用
# stress 的下一代 stress-ng,它支持更丰富的选项,比如
# stress-ng -i 1 --hdd 1 --timeout 600(--hdd 表示读写临时文件)。
使用
watch -d uptime
mpstat -P ALL 5
可以看到load average 升高,此时CPU使用率不高,但是iowait的比例很高,所以是IO导致的,之后定位IO高的进程,
# 间隔 5 秒后输出一组数据,-u 表示 CPU 指标
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command
13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H
13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H
13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress
13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat
大量进程(等待CPU)--load average 状态之一
# 8个进程
stress -c 8 --timeout 600

上图使用 pidstat -u 5可以看到,是进程太多,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 25%(之后会到达75%)。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。
posted on 2025-10-12 21:39 chuchengzhi 阅读(42) 评论(0) 收藏 举报
浙公网安备 33010602011771号