ps -eo state,pid,wchan:32,comm | grep '^D' cat /proc/<pid>/stack dmesg -T | tail -50 iostat -x 1 3
监控告警 load1 冲到 20,uptime 看着像满载,top 里 CPU 空闲 95%,业务响应却明显变慢,重启服务负载也降不下来,这种情况最容易看错方向。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:负载统计的是运行队列加上不可中断睡眠,大量进程卡在 D 状态等 IO 或等锁,CPU 自然闲着,只盯 CPU 使用率会把这个方向完全漏掉,先数进程状态。
「D 状态进程」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:按进程状态过滤出 D 开头的进程和它的阻塞点 看数量有多少;对可疑 pid 读 proc 下面的 stack 看卡在哪个调用 需要 root 权限才读得到;结合 iostat 和 dmesg 判断是磁盘还是网络存储 别先怀疑应用代码。
确认没问题再收工,D 状态进程数归零 load1 在五分钟内回落到 CPU 核数以内 业务延迟同步恢复。
