看到 GPU 利用率上升就扩容,看到延迟上升就重启,可能都碰巧有效,也可能掩盖真正原因。值班时需要的是一条能被下一位同事理解的因果链:用户遇到了什么,最近改了什么,哪项证据支持这个动作。
用户症状先于组件指标
先确定受影响范围:哪个租户、哪个模型、哪类请求、从何时开始。成功率、截止时间与输出质量优先于漂亮的资源曲线。一个节点很忙,不一定是根因;它可能正在替另一个故障节点承接流量。
这是处理顺序建议;遇到明确止损条件可以先执行已批准的可逆动作,同时补齐证据。
时间线至少要能排序
下面的教学事件没有来自任何生产事故。脚本只保证事件按时间排序,并把动作与之后的观察放在一起;时间接近不能证明因果关系。
events = [(30,"rollback"),(10,"latency_alert"),(20,"revision_checked"),(50,"user_metrics_reviewed")] ordered = sorted(events) for second, event in ordered: print(second, event) assert [e for _,e in ordered] == ["latency_alert","revision_checked","rollback","user_metrics_reviewed"]运行输出:
10 latency_alert 20 revision_checked 30 rollback 50 user_metrics_reviewed真正的证据应包含部署 revision、请求 ID、错误样本与关键指标截图或查询。不要为了节省几行报告,只留下“系统抖动,已恢复”。恢复后还能否解释当时发生了什么,决定下一次是否重复踩坑。
可逆动作也要写触发条件
回滚适合与变更关联较强且旧版本可恢复的情况;扩容适合已有证据支持容量瓶颈且新容量能及时加入的情况。两者都应有观察窗口和停止条件。若症状没有改善,应回到假设,而不是把同一动作重复十次。
Ray 发布记录中具体的调度修复,是排查组件缺陷的入口;它不能证明现场问题必然来自同一缺陷。版本、日志与复现条件必须对得上。
本文只验证 CPU 时间线排序,未参与生产值班,也未执行回滚或扩容。手记中的做法是可采用的流程建议,不是假装亲历的一次事故复盘。