三路判据:卡死,还是只是慢

三路判据:卡死,还是只是慢 A workflow diagram generated by Archify. 01 / 判据链 · 按顺序 02 / 判定结果与处置 心跳新鲜? · 调度循环每轮打点 · 判据链 · 按顺序 心跳新鲜? 调度循环每轮打点 队列有任务 · 空队列不判卡死 · 判据链 · 按顺序 队列有任务 空队列不判卡死 进展陈旧 · >30 分钟没推进 · 判据链 · 按顺序 进展陈旧 >30 分钟没推进 采集活动性证据 · ① CPU 时间 ② 日志 mtime · 判据链 · 按顺序 采集活动性证据 ① CPU 时间 ② 日志 mtime 健康 · 心跳新鲜,不干预 · 判定结果与处置 健康 心跳新鲜,不干预 空闲 · 队列里没有任务 · 判定结果与处置 空闲 队列里没有任务 正在推进 · 有进展,不干预 · 判定结果与处置 正在推进 有进展,不干预 慢但在算 · 继续等,不杀 · 判定结果与处置 慢但在算 继续等,不杀 卡死 · 清理会话 + 快照 + 告警 · 判定结果与处置 · 证据齐全才动手 卡死 清理会话 + 快照 + 告警 证据齐全才动手 新鲜 心跳陈旧 没有任务 有任务 进展新鲜 进展陈旧 任一路在动 两路全静止 Legend 服务 / 处理 安全校验 消息

两条错判之路

  • • 只看「多久没输出」→ 会把慢任务误杀,而慢是常态
  • • 只靠心跳 → 抓不到假死:心跳写在等待循环里,照打不误
  • • 实测:8 个任务挂了 153 分钟,心跳一直新鲜

判据为什么这样排

  • • 心跳与队列最便宜,先解释掉健康与空闲
  • • 进展陈旧才值得去采证据,不必每次都翻进程树和日志
  • • 证据必须来自两路独立信号:进程树 CPU 时间与会话日志修改时间

上线后的结果

  • • 把「在动」和「卡死」分开判定,该等的继续等
  • • 上这套判据后生产环境 0 次误杀
  • • 只有两路全静止才清理会话,动作始终带证据快照与告警