一次生产事故,带你看懂 Linux CPU、Load、IO、软中断的真相
CPU 100% 了,服务器是不是要挂了? 很多运维、开发一看到
top里 CPU 拉满,第一反应就是: 👉 “赶紧 kill 进程 / 扩容 / 重启!” 但在真实生产环境里: CPU 高,往往不是 CPU 的问题。
这篇文章不讲基础命令堆砌,而是结合真实生产事故,带你一步步拆解:
%wa、%si、%st 各自意味着什么?背景
40 / 38 / 35很多人第一步会做什么?
top看到结果却懵了👇
那 Load 40 是哪来的?
CPU 有多忙?
us:用户态sy:内核态wa:IO 等待si:软中断st:被虚拟化偷走的时间📌 CPU 100% ≠ 系统一定慢
有多少任务在抢 CPU 或等 CPU?
Load 统计的是:
👉 所以关键一句话:
Load 高,可能是 CPU 不够,也可能是 IO 把进程“堵”住了。
在事故机器上执行:
top重点看这一行:
%Cpu(s): 25 us, 10 sy, 0 ni, 55 id, 10 wa, 0 hi, 0 si, 0 st你会发现一个危险信号👇
wa = 10%
这意味着什么?wa意味着CPU在等IO时间。
当进程:
这些进程会进入 D 状态(不可中断):
ps -eo pid,stat,cmd | grep D📌 D 状态进程会被算进 Load!
所以出现经典现象:
❌ CPU 并不忙 ❌ 但进程全在排队 ❌ Load 飙升 ❌ 业务接口超时
2️⃣ 用 vmstat 一眼识别 IO 型“假 CPU 高”
vmstat 2重点看:
r b us sy wa id
2 20 20 10 50 20解释👇
字段 | 含义 |
|---|---|
r | 等 CPU 的进程 |
b | 等 IO 的进程 |
wa | CPU 等 IO 时间 |
b 很大 + wa 很高 = IO 拖垮系统
iostat -x 2重点字段:
%util → 是否接近 100%await → IO 响应时间svctm → 服务时间📌 事故机器中:
%util 长期 95%+await 飙到 200msMySQL 慢 SQL + 单磁盘 + 大量随机 IO
👉 CPU 看起来“没事”, 👉 但业务已经“半死”。
这是很多人最容易踩的坑。
这是我在生产环境固定使用的顺序
uptime② 看 CPU 时间分布 top 重点不是进程,而是:
③ 判断是不是 IO 问题 vmstat 2 iostat -x 2 ④ 精确定位进程 ps -eo pid,stat,pcpu,cmd | sort -k3 -r | head ⑤ 再看业务本身
八、生产中的解决方案 ✅ 短期止血
✅ 中期优化
✅ 长期方案
wa 告警本文分享自 DevOps和k8s全栈技术 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!