温馨提示×

为什么linux进程卡死

小樊
51
2026-09-12 10:51:37
栏目: 智能运维

Linux 进程“卡死”(hang / stuck / unresponsive)是一个常见但原因多样的问题。下面从常见原因分类到排查思路系统说明。


一、常见原因分类

1. CPU 相关

  • 死循环 / 高 CPU 占用
    • 代码逻辑错误(while(true) 无退出)
    • 频繁计算、正则回溯爆炸
  • 表现:
    • 进程 CPU 使用率接近 100%
    • 系统变慢,但进程未退出

2. 阻塞在 I/O(最常见)

进程在等某个资源,一直不返回:

  • 磁盘 I/O 卡死
    • 磁盘坏道
    • NFS / 网络存储挂载失败
  • 网络 I/O 卡死
    • 对方服务无响应
    • 防火墙丢包
    • TCP 连接未设超时
  • 终端/管道阻塞
    • 管道写满,读端不读

3. 锁 / 同步问题(多线程常见)

  • 死锁(deadlock)
    • 两个线程互相持有对方需要的锁
  • 自旋锁未释放
  • 条件变量使用错误

表现:

  • 进程状态为 S(睡眠)
  • 多核 CPU 空闲但进程不动

4. 等待系统资源

  • 内存不足(OOM 前)
    • 大量 swap
  • 文件描述符耗尽
  • 进程数达到上限

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:数据库慢

  • 进程卡在 recvfrom
  • CPU 很低

场景 3:多线程死锁

  • 多个线程都在 futex
  • 程序完全无响应

四、如何避免

  • 所有 I/O 设置超时
  • 多线程使用锁顺序规范
  • 避免同步阻塞调用
  • 监控:
    • CPU
    • 线程数
    • FD 数
    • 系统调用延迟

如果你愿意,可以告诉我:

  • 进程语言(C / Java / Python / Go?)
  • ps 状态
  • strace 输出

我可以帮你精确定位是哪一种卡死。

0 踩