现场是这样的。监控显示十五分钟负载一直在十几,top 里 CPU 使用率只有一成,业务也没明显变慢,报警却从早响到晚。

真正麻烦的地方在于,几个原因的现象几乎一样。负载统计的是可运行和不可中断进程总数,等待 IO 的也算进去;大量短命进程不断创建销毁,把运行队列推高了;IO 等待让进程排队,但完全不消耗处理器时间。

上来先看运行队列和阻塞进程数

vmstat 1 5

接着统计各状态进程数量

ps -eo stat | sort | uniq -c | sort -rn

定位不可中断进程

ps -eo pid,stat,comm | awk '$2 ~ /D/'

剩下的就是核对存储侧延迟

iostat -x 1 3

那几天正好在做别的变更,先把时间线对齐才敢动手。

恢复的判定其实很直接。运行队列降到核数以下,负载回到个位数,报警自动恢复,业务延迟不变。

提醒一点。负载高低要结合核数看,八核机器负载到八才算满;只看绝对值容易把正常水位当成故障。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189