温馨提示×

linux进程为何卡死

小樊
77
2026-08-05 10:59:51
栏目: 智能运维

Linux 进程“卡死”通常不是真的“死掉”,而是处于某种不可中断或等待状态。下面按最常见原因由浅入深解释,并给出排查思路。


一、进程状态先搞清楚

pstop 看进程状态(STAT 列):

ps -eo pid,stat,cmd

常见状态含义:

状态 含义
R 正在运行或在运行队列
S 可中断睡眠(等事件,如 socket、sleep)
D 不可中断睡眠(通常卡死在这里)
Z 僵尸进程
T 被暂停(如 Ctrl+Z)
I 空闲内核线程

90% 的“卡死”都是 D 状态


二、最常见原因(按概率)

1️⃣ 等待 I/O(磁盘 / NFS / 网络存储)【最常见】

表现

  • 进程状态为 D
  • 系统其他进程正常
  • 多与磁盘、NFS、Ceph、iSCSI 有关

典型场景

  • NFS server 挂了
  • 磁盘出现 I/O error
  • 云盘、网络存储超时

排查

dmesg | tail -n 50
iostat -x 1

结论

进程在等内核 I/O 返回,内核不允许中断,所以卡死


2️⃣ 锁竞争 / 死锁

表现

  • 多进程 / 多线程
  • 卡在 futexmutexrwlock

排查

pstack <pid>
strace -p <pid>

常见原因

  • 多线程死锁
  • 程序 bug
  • glibc / 内核 bug(较少)

3️⃣ 内存不足(OOM / swap)

表现

  • 系统变慢
  • 进程卡在内存分配
  • 可能看到 kswapd 很高

排查

free -h
vmstat 1
dmesg | grep -i oom

注意

内存不足时,进程可能卡在 page fault,看起来像“假死”


4️⃣ 内核 bug / 驱动问题

表现

  • 多个进程同时卡死
  • 内核日志异常

排查

dmesg
uname -a

5️⃣ 僵尸进程(看起来卡死)

表现

  • 状态 Z
  • 不占 CPU
  • 不消失

原因

  • 父进程没 wait()

解决

  • 杀掉父进程

6️⃣ 被信号暂停(T)

表现

  • 状态 T
  • 常见于后台任务

解决

kill -CONT <pid>

三、快速定位“卡死在哪”

✅ 1. 先看状态

ps -eo pid,stat,cmd | grep <进程名>

✅ 2. 看系统日志

dmesg -T | tail -n 100
journalctl -xe

✅ 3. 看调用栈(D 状态必看)

cat /proc/<pid>/wchan
cat /proc/<pid>/stack

✅ 4. 看系统资源

top
iostat -x 1
vmstat 1

四、为什么 D 状态“杀不掉”?

kill -9 没用

原因:

  • 进程在内核态
  • 正在等 I/O 完成
  • 内核不允许中断

只能等 I/O 返回或重启系统


五、总结一句话

Linux 进程卡死,90% 是“等 I/O 或锁”,不是真的死。

如果你愿意,可以把下面信息发我,我可以帮你精准判断:

  • ps -eo pid,stat,cmd
  • dmesg 最后几行
  • 是本地磁盘还是 NFS / 云盘
  • 是否多线程程序

我可以直接告诉你“该不该重启”。

0