首页/AI/大模型部署与运维速查/崩溃循环:先停自愈再抓现场
运维监控与排障50 条

崩溃循环:先停自愈再抓现场

服务反复重启时,自愈机制会把崩溃日志刷成噪音;处置是先暂停自动重启、拿到崩溃瞬间的退出码与日志,再决定修复路径,避免在循环里弄丢现场。

崩溃循环先抓现场

服务反复重启时,自愈机制会把日志刷成噪音,最后一屏反而什么都看不出来。正确做法是先暂停自动重启,拿到崩溃瞬间的退出码与日志,再决定修复路径。让循环停下来,是排查的前提。

基本信息

处置顺序先停自愈再抓现场
关键信息退出码与最后一段日志
常见原因内存被杀、应用异常、外部终止
记录项重启次数与容器状态
恢复确认原因后再放开自愈

典型使用场景

  • 上线后服务反复重启
  • 容器被内存限制杀掉
  • 进程收到外部终止信号
  • 排查「重启次数在涨但业务看着正常」
  • 把崩溃现场(退出码、最后日志、时间点)记录到事故单里

取证

取证
systemctl status <服务> | head -30            # 看重启计数
docker inspect --format '{{.RestartCount}} {{.State.OOMKilled}}' <容器>
journalctl -u <服务> -n 200 --no-pager | tail -50
# 排查期间临时把重启策略收敛或停掉单元,避免刷屏与反复抢占 GPU

退出码速查

退出码常见含义优先怀疑
137被强制终止内存不足或超时被杀
1应用异常退出看调用栈首段
143收到终止信号先查是谁在发信号
容器被杀触发内存限制核对容器资源限额
排查期间临时收敛重启策略:不这么做的话日志会被反复刷屏,还会反复抢占 GPU 资源,让同机的其它服务也受影响。
崩溃前的最后几行日志最有价值:把日志按实例与时间归档,避免被后续重启的输出覆盖。
退出码要结合容器状态一起看:被内存限制杀掉与收到终止信号,处理路径完全不同。
观察期至少覆盖一个完整流量周期:只在低峰观察通过的话,高峰才出现的问题可能完全没暴露。

易错点

  • 盯着「又重启了」反复刷日志:先让循环停下来,静止状态下的最后一屏才是证据
  • 看到退出码 137 就认定内存不足:也可能是被超时或编排策略终止,需要看容器状态确认
  • 排查期间不禁用自愈:重启会清掉现场,问题难以复现
  • 修完不观察直接放开自愈:没有观察期,同样的循环可能马上再来一次
  • 只加内存就上线:真实原因可能是长请求或资源泄漏,症状会换个方式再出现

数据来源与参考

  • systemd.service 手册:Restart(freedesktop.org)
  • Docker 官方文档:docker inspect 与容器状态
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌