进程卡死定位是什么场景
服务不响应但进程还在、CPU 不高、日志也没有报错,这类假死最难查。原因是进程其实还活着,只是卡在某个系统调用上:等网络对端回包、等磁盘 IO 完成、或者等一把锁。最快的办法是把进程当前的系统调用直接打出来看,再对照内核记录的等待点,几分钟内就能判断卡在哪一类操作上,比对着代码猜快得多。生产环境要注意抓取时间必须短。
基本信息
| 适用平台 | GNU/Linux(strace 与 /proc 文件系统) |
|---|---|
| 场景 | 进程假死、无响应但未退出 |
| 组合手段 | 跟踪系统调用加对照内核等待点 |
| 常用约束 | 限定跟踪类别、限制输出、外部超时包住 |
| 等待点来源 | /proc/进程号/wchan 与进程状态字段 |
| 注意事项 | 跟踪会短暂暂停目标进程 |
典型使用场景
- 健康检查失败但进程仍在、端口仍处于监听状态。
- 请求长时间无响应,日志停在某一步没有后续。
- 排查死锁嫌疑:进程占用 CPU 极低但完全不动。
- 区分卡在磁盘还是网络,缩小排查范围。
- 上线前验证风险操作是否会被锁阻塞。
快速看现场
快速看现场
pid=$(pgrep -f 'app-server' | head -1) # 定位进程号
cat /proc/$pid/wchan; echo # 内核等待点,无需跟踪工具
timeout 5 strace -f -p $pid -e trace=network -s 128 2>&1 | tail -30
timeout 5 strace -f -p $pid -e trace=read,write,openat 2>&1 | tail -20
ps -o pid,stat,wchan:20,cmd -p $pid # 状态与等待点一起看
timeout 5 strace -f -p $pid -c 2>&1 | tail -20 # 系统调用耗时统计现象与方向对照
| 观察到的现象 | 含义 | 处理方向 |
|---|---|---|
| 停在等待事件调用 | 事件循环空闲 | 通常没有流量,不是故障 |
| 停在读或写调用 | 对端慢或大块 IO | 检查下游服务与磁盘 |
| 停在锁相关调用 | 锁竞争或死锁嫌疑 | 检查锁等待与线程栈 |
| 等待点为空 | 正在用户态执行 | 关注 CPU 占用与线程状态 |
| 输出为空 | 权限或能力不足 | 补充跟踪权限后重试 |
跟踪工具会让目标进程短暂停下,生产上必须用外部超时包住并把时间控制在几秒;长时间挂着的风险很高。
跟踪输出默认写到标准错误:管道处理时要显式重定向,否则会以为命令没有任何输出。
容器里可能缺少跟踪所需的权限或能力,需要额外授权;没有跟踪工具时,内核等待点文件同样能给出方向。