Poketto

漏装一台服务器,Knight Capital 45 分钟亏掉 4 亿多美元:旧代码被误激活,几天后靠融资续命

目录

部署版本不一致与遗留代码概念插画

配图:AI 生成的概念示意图,非论文原图、真实现场或实验数据。

TL;DR:2012 年 8 月 1 日,美国做市商 Knight Capital 在一次系统升级中漏装了 8 台服务器中的 1 台,旧的废弃功能被意外唤醒,45 分钟内疯狂下单。事发当天外界通报亏损约 4.4 亿美元,SEC 后来的文件写的是“超过 4.6 亿美元”。公司随后靠一笔约 4 亿美元的紧急融资保命,后来并入 Getco。事故不是单一原因,而是部署、旧代码、风控和应急流程一起失守。

这是一件 2012 年的旧事,不是今天的新闻。它至今仍是软件工程里最常被引用的部署事故之一。

背景:一段早就不用的代码

Knight 的订单路由系统叫 SMARS,共有 8 台服务器。2012 年 7 月底,团队为了接入纽交所新推出的零售流动性计划(RLP),部署一批新代码。新代码要替换掉一个叫 Power Peg 的老功能,Knight 早在 2003 年就停用了它,但代码一直留在系统里。

更麻烦的是,新功能复用了原来用来开启 Power Peg 的那个标志位。也就是说,同一个开关,在装了新代码的服务器上代表 RLP,在没装的服务器上仍然代表旧功能。

45 分钟里发生了什么

SEC 的调查认定,部署由一名技术人员手动完成,其中一台服务器漏装了新代码,也没有第二个人复核,当时也没有要求复核的书面流程。

8 月 1 日开盘,带着该标志位的订单打到这台服务器,旧的 Power Peg 被触发。它的“已成交数量”判断逻辑早在 2005 年改动后就没再测试过,于是不会停手,不断生成子订单。

开盘前后系统还发出了 97 封报错邮件,提到“Power Peg disabled”,但没有人把它当成需要紧急处理的警报。处置过程中,技术人员又把另外 7 台服务器上的新代码卸载,结果让这些服务器也开始激活旧功能,问题更糟。

按 SEC 的数字,SMARS 在处理 212 笔小额零售订单的过程中,发出数百万笔订单,在 154 只股票上成交超过 400 万次、近 4 亿股,最终留下约 35 亿美元的多头和约 31.5 亿美元的空头头寸,亏损超过 4.6 亿美元。

后果

Knight 的资本撑不住这个窟窿。几天后,它宣布由 Jefferies 等机构牵头注入约 4 亿美元,换来大量新股,原股东被严重稀释。2013 年 7 月,Knight 与 Getco 合并为 KCG Holdings。

2013 年 10 月,Knight 与 SEC 和解(不承认也不否认调查结论),因违反市场准入规则被罚 1200 万美元。SEC 指出的问题包括缺少防止错误订单的控制、没有公司级资金上限、也没有应对事故的流程。

为什么值得记住

这件事的荒诞在于:真正的炸弹是一段 9 年前就不用、却没人删除的代码,而引爆它的只是一次手工部署少点了一台机器。

教训很朴素:删掉死代码,别复用旧开关,部署要自动化并有人复核,上线要有熔断和回滚预案,告警要有人认领。

来源:SEC Order, Knight Capital Americas LLC (Release No. 34-70694)

关注这个空间,它的新文章会出现在你的关注动态里。