cat case/PM-2012-0801.md

部署冲突触发旧死代码,45 分钟亏 4.6 亿美元

P0 · 异常下单 400 万次,亏损 4.6 亿美元

摘要

2012-08-01,Knight Capital 上线新交易功能 SMARS 时,部署流程未停用仍驻留在生产环境的旧代码(Power Peg),且新功能复用了旧代码的一个标志位。开盘后旧死代码被触发,以失控方式反复提交子订单,45 分钟内产生约 400 万笔异常交易,造成 4.6 亿美元亏损,公司濒临破产。

# 新旧代码并存 + 复用标志位 = 把废弃死代码重新通电。

时间线

开盘前部署新功能,旧 Power Peg 代码未停用
09:30美股开盘,旧代码被标志位复用触发
09:30–10:15系统疯狂下单,风险持续累积
~10:15手动停止相关功能
盘后披露 4.6 亿美元亏损,濒临破产

根因

Knight 上线新交易功能 SMARS 时,部署流程存在两处致命缺陷:其一,新代码只部署到了 8 台生产服务器中的 7 台,第 8 台仍运行旧逻辑,导致流量路由不均;其二,早已在 2005 年停用、却从未从生产环境清理掉的旧代码 Power Peg 仍驻留在系统中,而新功能恰好复用了 Power Peg 的标志位,等于把这段「死代码」重新通电。开盘后,SMARS 把子订单路由给 Power Peg 逻辑,其 repurchase 累加逻辑在异常输入下无限循环,产生海量子订单。

  • 部署流程缺陷:新 SMARS 仅部署到 7/8 服务器,第 8 台遗漏,流量路由不均。
  • 旧 Power Peg 代码(2005 停用)长期「幽灵」驻留生产,未被清理。
  • 新功能复用旧标志位,语义冲突激活本应废弃的死代码路径。
  • Power Peg 的 repurchase 累加逻辑在异常输入下无限循环,且无实时风控熔断拦截。

放大因素

金融市场高频放大亏损;无实时风控闸口;旧代码长期并存未被发现,是典型「部署流程」缺陷。

缓解措施

  • 部署前强制停用 / 移除旧版本代码,禁止新旧并存。
  • 标志位 / 配置禁止跨版本复用。
  • 上线前小流量冒烟 + 实时风控闸口。

经验教训

金融系统部署必须保证「新旧不共存」;复用标志位是高危反模式;上线前的冒烟与风控闸口不是可选项。

检查清单

  • 确认部署是否清理了旧版本代码
  • 检查新功能是否复用既有标志位 / 配置
  • 验证上线前冒烟与交易前风控
  • 复盘部署流程的版本并存风险
  • 确认实时熔断阈值