负载与 CPU 诊断
目标
亲自确认负载平均值究竟统计什么,并结合 CPU 使用率、PSI 与节流计数器,学会解释‘指标正常但系统很慢’的情况。
为什么重要
Linux 的负载平均值不只统计等待 CPU 的任务,也会统计等待磁盘或 NFS 响应的 D 状态任务。因此,8 核服务器负载为 24、CPU 空闲率仍有 60%,完全可能是正常现象。此时增加 CPU 只会浪费钱。相反,容器的 cgroup 节流不会反映在负载、steal 或使用率中,因为被节流的任务会彻底离开运行队列。因此必须单独查看 cpu.stat 的计数器。本实验连‘不存在就写不存在’也纳入评分,是因为实际工作中,首先确认文件是否存在就是第一步。
步骤
在 /root/load 目录中工作。
- 只把当前环境的 CPU 数量写入
/root/load/cpus.txt。 - 在后台启动至少 2 个持续占用 CPU 的进程,并把 PID 逐行写入
/root/load/burner_pids.txt。这些进程必须在后续步骤中始终存活。 - 等待 1~2 分钟后,将
/proc/loadavg的1 分钟平均值写入/root/load/load1.txt。该值必须至少为 0.7。 - 将这些进程当前的单个状态字符写入
/root/load/state.txt。 - 将第一个进程的**累计 CPU 时间(秒)**以整数写入
/root/load/cpu_sec.txt。必须至少为 5 秒。 - 从
/proc/pressure/cpu的some行读取avg10值,并写入/root/load/psi.txt。文件不存在时写入unavailable。 - 从 cgroup 的
cpu.stat读取nr_throttled值,写入/root/load/throttle.txt,格式为nr_throttled=<값>。无法读取时写入unavailable。 - 创建
/root/load/loadcheck.sh <임계비율>。如果1분 부하 평균 / CPU 개수超过阈值,输出high load=<값> cpus=<개수>并返回退出码 1;否则输出ok并返回退出码 0。没有参数时必须返回非 0。
提示
- 使用
python3 -c "while True: pass" &可以消耗 CPU。 /proc/<PID>/stat的字段顺序为pid (comm) state ...,第 14、15 个字段是 utime/stime(clock tick)。- 可以使用
awk 'BEGIN {exit (a/b > t) ? 1 : 0}'这种形式,不依赖 bc 比较小数。 - 常见错误 1:第 3 步制造负载后立即读取,值会很低。指数衰减平均值即使经过 1 分钟也只反映 63%。
- 常见错误 2:第 8 步前先清理制造负载的进程,会导致判断测试失败。
查看 CPU 数量
只把当前环境的 CPU 数量写入 /root/load/cpus.txt。
nproc 最简单。负载平均值只有与这个数字放在一起比较才有意义。
启动消耗 CPU 的进程
在后台启动至少 2 个持续占用 CPU 的进程,并把 PID 逐行写入 /root/load/burner_pids.txt。这些进程必须在后续步骤中始终存活。
启动两个执行无限循环的 python3 进程即可。每行写一个 PID。
确认负载平均值上升
等待 1~2 分钟后,将 /proc/loadavg 的1 分钟平均值写入 /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/cpu 的 some 行读取 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 也可以比较小数。