LabHub
学习 学习路径 课程

Linux 故障处理

负载与 CPU 诊断

在 LabHub 中继续学习

目标

亲自确认负载平均值究竟统计什么,并结合 CPU 使用率、PSI 与节流计数器,学会解释‘指标正常但系统很慢’的情况。

为什么重要

Linux 的负载平均值不只统计等待 CPU 的任务,也会统计等待磁盘或 NFS 响应的 D 状态任务。因此,8 核服务器负载为 24、CPU 空闲率仍有 60%,完全可能是正常现象。此时增加 CPU 只会浪费钱。相反,容器的 cgroup 节流不会反映在负载、steal 或使用率中,因为被节流的任务会彻底离开运行队列。因此必须单独查看 cpu.stat 的计数器。本实验连‘不存在就写不存在’也纳入评分,是因为实际工作中,首先确认文件是否存在就是第一步。

步骤

/root/load 目录中工作。

  1. 只把当前环境的 CPU 数量写入 /root/load/cpus.txt
  2. 在后台启动至少 2 个持续占用 CPU 的进程,并把 PID 逐行写入 /root/load/burner_pids.txt。这些进程必须在后续步骤中始终存活。
  3. 等待 1~2 分钟后,将 /proc/loadavg1 分钟平均值写入 /root/load/load1.txt。该值必须至少为 0.7。
  4. 将这些进程当前的单个状态字符写入 /root/load/state.txt
  5. 将第一个进程的**累计 CPU 时间(秒)**以整数写入 /root/load/cpu_sec.txt。必须至少为 5 秒。
  6. /proc/pressure/cpusome 行读取 avg10 值,并写入 /root/load/psi.txt。文件不存在时写入 unavailable
  7. 从 cgroup 的 cpu.stat 读取 nr_throttled 值,写入 /root/load/throttle.txt,格式为 nr_throttled=<값>。无法读取时写入 unavailable
  8. 创建 /root/load/loadcheck.sh <임계비율>。如果 1분 부하 평균 / CPU 개수 超过阈值,输出 high load=<값> cpus=<개수> 并返回退出码 1;否则输出 ok 并返回退出码 0。没有参数时必须返回非 0。

提示

查看 CPU 数量

只把当前环境的 CPU 数量写入 /root/load/cpus.txt

nproc 最简单。负载平均值只有与这个数字放在一起比较才有意义。

启动消耗 CPU 的进程

在后台启动至少 2 个持续占用 CPU 的进程,并把 PID 逐行写入 /root/load/burner_pids.txt。这些进程必须在后续步骤中始终存活。

启动两个执行无限循环的 python3 进程即可。每行写一个 PID。

确认负载平均值上升

等待 1~2 分钟后,将 /proc/loadavg1 分钟平均值写入 /root/load/load1.txt。该值必须至少为 0.7。

这是指数衰减平均值,不会立即上升。等待 1~2 分钟后,读取 /proc/loadavg 的第一个值。

读取进程状态字符

将这些进程当前的单个状态字符写入 /root/load/state.txt

/proc//stat 的第三个字段是状态。持续使用 CPU 的进程会是什么字符?

测量累计 CPU 时间

将第一个进程的**累计 CPU 时间(秒)**以整数写入 /root/load/cpu_sec.txt。必须至少为 5 秒。

把 /proc//stat 的 utime 与 stime 相加,再除以 clock tick(通常为 100)。

读取 PSI 压力指标

/proc/pressure/cpusome 行读取 avg10 值,并写入 /root/load/psi.txt。文件不存在时写入 unavailable

/proc/pressure/cpu 的 some 行中包含 avg10。文件不存在时写入 unavailable。

cgroup 节流计数器

从 cgroup 的 cpu.stat 读取 nr_throttled 值,写入 /root/load/throttle.txt,格式为 nr_throttled=<값>。无法读取时写入 unavailable

cpu.stat 中包含 nr_periods 和 nr_throttled。无法读取时写入 unavailable。

负载判断脚本

创建 /root/load/loadcheck.sh <임계비율>。如果 1분 부하 평균 / CPU 개수 超过阈值,输出 high load=<값> cpus=<개수> 并返回退出码 1;否则输出 ok 并返回退出码 0。没有参数时必须返回非 0。

将负载平均值除以核心数,再与阈值比较。不用 bc,awk 也可以比较小数。