现场是这样的。监控显示十五分钟负载一直在十几,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
那几天正好在做别的变更,先把时间线对齐才敢动手。
恢复的判定其实很直接。运行队列降到核数以下,负载回到个位数,报警自动恢复,业务延迟不变。
提醒一点。负载高低要结合核数看,八核机器负载到八才算满;只看绝对值容易把正常水位当成故障。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。