Linux 进程“卡死”(hang / stuck / unresponsive)是一个常见但原因多样的问题。下面从常见原因分类到排查思路系统说明。
一、常见原因分类
1. CPU 相关
- 死循环 / 高 CPU 占用
- 代码逻辑错误(while(true) 无退出)
- 频繁计算、正则回溯爆炸
- 表现:
- 进程 CPU 使用率接近 100%
- 系统变慢,但进程未退出
2. 阻塞在 I/O(最常见)
进程在等某个资源,一直不返回:
- 磁盘 I/O 卡死
- 网络 I/O 卡死
- 终端/管道阻塞
3. 锁 / 同步问题(多线程常见)
- 死锁(deadlock)
- 自旋锁未释放
- 条件变量使用错误
表现:
- 进程状态为
S(睡眠)
- 多核 CPU 空闲但进程不动
4. 等待系统资源
- 内存不足(OOM 前)
- 文件描述符耗尽
- 进程数达到上限
5. 内核态卡死(严重)
- 内核 bug
- 驱动问题(如某些 GPU / 网卡驱动)
- 硬中断风暴
表现:
- 进程状态为
D(不可中断睡眠)
kill -9 也杀不掉
6. 外部依赖卡死
- 数据库慢查询
- 依赖的下游服务挂了
- DNS 解析阻塞(未设超时)
二、如何用命令快速判断
1. 看进程状态
ps -eo pid,ppid,stat,pcpu,pmem,cmd | grep 进程名
状态说明:
R:运行中
S:可中断睡眠(等 I/O)
D:不可中断睡眠(内核卡死)
Z:僵尸进程
2. 看卡在哪
top
或
htop
- CPU 高 → 逻辑问题
- CPU 低 + 状态 S/D → 阻塞
3. 看系统调用
strace -p PID
常见卡点:
futex(锁)
read / write(I/O)
connect / recvfrom(网络)
4. 看调用栈(C/C++/内核)
cat /proc/PID/stack
或
pstack PID
5. 磁盘 / 网络
iostat -x 1
dstat
netstat -antp
ss -antp
三、典型场景举例
场景 1:NFS 挂载挂了
- 进程状态
D
kill -9 无效
- 只能重启或恢复 NFS
场景 2:数据库慢
场景 3:多线程死锁
四、如何避免
- 所有 I/O 设置超时
- 多线程使用锁顺序规范
- 避免同步阻塞调用
- 监控:
如果你愿意,可以告诉我:
- 进程语言(C / Java / Python / Go?)
ps 状态
strace 输出
我可以帮你精确定位是哪一种卡死。