返回首页

Linux 进程状态诊断 — 从 R/S/D/T 态看穿系统瓶颈

📅 创建于 2026-06-08 🔄 更新于 2026-06-08 📝 574 字

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 5perf top -p <pid> 找热点函数
④ I/O 瓶颈 iostat -x 2iotop/proc/<pid>/wchan 磁盘慢/NFS
⑤ 内存换页 free -hvmstat 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 2iotop 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 飙高排查指南