Linux 进程状态诊断 — 从 R/S/D/T 态看穿系统瓶颈
来源:Linux能量补给站 | 发布日期:2026-06-01
进程四态
| 状态 | ps STAT | 含义 | 运维信号 |
|---|---|---|---|
| 运行 (Running) | R | 正在占 CPU 执行指令 | %CPU 高 → CPU 密集 |
| 就绪 (Ready) | R | 万事俱备只差 CPU | 进程 R 但 %CPU=0 → CPU 饥饿 |
| 阻塞 (Blocked) | S / D | 等待事件(I/O/网络/锁) | S 可中断;D 不可中断 → 磁盘/NFS 瓶颈 |
| 停止 (Stopped) | T | 被 SIGSTOP 挂起,不参与调度 | kill -CONT 恢复 |
状态切换闭环
Ready ──调度──▶ Running ──时间片用完──▶ Ready
│
▼ (等待事件)
Blocked ──事件完成──▶ Ready
Running / Ready ◀──SIGCONT── Stopped ──SIGSTOP──▶
诊断命令
运行状态(Running)— CPU 消耗
top -c # 看 %CPU 列,S 列为 R 即占 CPU 中
pidstat -u 2 5 # 区分 %usr(用户态)和 %system(内核态)
perf top -p <pid> # 定位 CPU 热点函数(正则匹配/加密/死循环)
就绪状态(Ready)— CPU 饥饿
ps 状态也是 R,但 %CPU 趋近 0。
vmstat 2 5 # r 列:就绪队列长度。持续 > CPU 核数 = CPU 瓶颈
sar -q 2 5 # runq-sz 运行队列长度
# 定位就绪饥饿进程
ps -eo pid,stat,pcpu,comm --sort=-pcpu | grep ' R'
# 观察 %CPU 极低的 R 进程
阻塞状态(Blocked)— I/O 与锁等待
D 状态(不可中断,最棘手): 等待磁盘 I/O,kill -9 无效。
ps aux | awk '$8 ~ /D/' # 找 D 状态进程
cat /proc/<pid>/wchan # 阻塞的内核函数(如 wait_on_buffer)
cat /proc/<pid>/stack # 内核调用栈
iostat -x 2 # %util / await 高 → 磁盘慢
iotop -o # 正在 I/O 的进程
dmesg | tail # 块设备错误 / "task blocked" 信息
# 如果 D 状态无法杀死且 dmesg 有 "task blocked for more than 120 seconds"
# → 通常是 NFS/CIFS 远程文件系统故障,需从存储侧处理
S 状态(可中断): 等待网络/用户输入/锁。
strace -p <pid> -f -T -e trace=network,read,write
# -T 输出每次调用的耗时。但 strace 有明显性能影响,生产慎用
停止状态(Stopped)— 冻结取证
kill -STOP <pid> # 冻结进程,保留完整现场(内存/连接/文件句柄)
kill -CONT <pid> # 恢复运行
# 应用场景:Redis 一致性备份
kill -STOP <redis_pid> # 冻结写操作
tar -czf dump.tar.gz /data/redis/ # 做快照
kill -CONT <redis_pid> # 恢复服务
一体化诊断流程
当服务器告警时,按此流程快速定性:
| 步骤 | 命令 | 判断 |
|---|---|---|
| ① 看负载 | uptime / top |
%idle 高低 |
| ② 看状态分布 | ps -eo stat \| sort \| uniq -c \| sort -rn |
R 多→CPU,D 多→IO |
| ③ CPU 瓶颈 | pidstat -u 2 5 → perf top -p <pid> |
找热点函数 |
| ④ I/O 瓶颈 | iostat -x 2 → iotop → /proc/<pid>/wchan |
磁盘慢/NFS |
| ⑤ 内存换页 | free -h;vmstat 2 中 si/so 持续非零 |
严重换页 |
| ⑥ 保留现场 | kill -STOP <pid> |
冻结可疑进程再分析 |
速查表
| 目的 | 命令 | 关键输出 |
|---|---|---|
| 进程状态 | ps -eo pid,stat,wchan,comm --sort=-%cpu |
STAT: R/S/D/T |
| 运行队列 | vmstat 2 |
r(就绪),b(阻塞),cs(上下文切换) |
| 历史队列 | sar -q |
runq-sz, ldavg |
| 进程 CPU | pidstat -u 2 5 |
%usr, %system |
| 进程 I/O | pidstat -d 2 或 iotop |
kB_rd/s, kB_wr/s |
| 阻塞位置 | cat /proc/<pid>/wchan |
内核函数名 |
| 系统调用 | strace -p <pid> -c |
syscall 耗时统计 |
| 线程栈 | pstack <pid> |
各线程调用栈 |
| 磁盘级 | iostat -x 1 |
%util, await, r/s, w/s |
| 冻结/恢复 | kill -STOP <pid> ; kill -CONT <pid> |
状态变 T / 恢复 |
关联页面
| 页面 | 关联点 |
|---|---|
| linux-load-average-guide | Load Average 原理(R+D 状态是负载的组成部分) |
| linux-load-high-cpu-low-troubleshooting | Load 高 CPU 低排查(D/Z 状态在决策树中的应用) |
| server-performance-four-dimensions | 服务器性能四维分析法 |
| linux-essential-commands-reference | Linux 常用命令参考 |
| cpu-spike-troubleshooting-guide | CPU 飙高排查指南 |