CPU平均负载升高的三个排查角度

yum install -y man-pages

画板

平均负载 == 平均活跃进程数 != cpu使用率

uptime:1 分钟、5 分钟、15 分钟的平均负载(Load Average)。

1616890717081-2430aafa-ba26-4428-af35-cf65b038163d.png

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 

1616890089382-e8ddbd53-3a7f-41cf-ad28-05f1460d4cc6.png

根据系统负载趋势,当平均负载高于 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

1616892866300-82002d1d-7243-48d8-aee6-bd51d4756f7d.png

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

1616892643528-596c2218-c59f-4f00-80ae-bff58a04b6db.png

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

1616893515491-b1bbb991-6683-4434-a37e-9001b2118e89.png

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

posted on 2025-10-12 21:39  chuchengzhi  阅读(42)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客