4.65亿美元:一次交易系统升级引发的灾难

BugInCode

一次系统升级导致骑士资本(Knight Capital )4.65亿美元的交易损失,这一切是如何发生的?

为了让客户参与纽约证券交易所的Retail Liquidity计划(RLP),Knight Capital决定对系统中和订单处理流程相关的代码进行更改。这次更改需要给SMARS系统开发、部署新的代码。SMARS是一个自动化、高速度向交易市场发送执行命令的算法路由器。SMARS的核心功能就是接受来自Knight交易平台发送的交易指令,然后根据整个交易市场的流动性向外发出一个或多个执行命令。

在新部署的过程中,Knight的团队计划用新的RLP代码取代SMARS中已经多年没有使用的相关部分。这些未使用的代码先前是被一个名为“Power Peg”的功能所用。虽然多年没有使用但是该功能一直被保留着而且在进行RLP部署时依然可以调用。新的PLP代码会对以前激活Power Peg代码的标志符进行更改。这样当先前的标志符被设定成“yes”时就可以删除无用的Power Peg代码,新的PLR功能将开始运行。

在Knight运用Power Peg代码的情况下,当一个子命令被执行的时候,一个累积量函数认为这些数目的股票父命令已经被执行了。这一特性使系统在父命令完成之前停止释放子命令。在2003年Knight已经停止使用Power Peg功能。在2005年,Knight将Power Peg中追踪累计股票功能的函数移动到SMARS代码中更前的序列,可是在更改之后Knight却没有对可用性进行测试。

2012年7月27日,Knight开始分阶段向SMARS系统部署新的RLP代码。在这期间负责部署的一位技术人员不慎漏掉了一台服务器,这样八台SMARS服务器中就仅有七台被部署上了新的代码。对于这样的新代码部署,Knight内部没有技术人员做二次检查,而且技术团队内部甚至没有人意识到Power Peg代码还没有从八台服务器中移除。Knight对于这样的业务流程缺乏书面操作规范。

在八月一日,Knight新系统开始接受来自证券经纪人的订单。那七台部署过新代码的服务器在处理订单时工作正常,但是第八台服务器在处理订单时却触发了没有被移除且有缺陷的Power Peg代码。结果就是这台服务器开始向交易中心发送子命令执行。Knight也接受一些合格的订单进行盘前交易。6台SMARS服务器负责处理这些订单,在上午八点左右Knight的内部系统开始发送“Power Ped disabled”的报错邮件。在九点半开盘前有97封邮件发送到Knight工作人员的邮箱,但是由于Knight系统警报没有设计这种类型的消息,所以当他们收到这类邮件时一般不予审查。

由于Knight没有处理这类重大问题的相关程序和指南,所以在当天其只能依靠其技术团队在一个实时交易环境下去查找定位问题。在这个过程中Knight的新系统依然在不断向交易市场发送子命令,更糟糕的事情是在他们定位系统问题的过程中卸载了其余七台服务器上正确部署的RLP代码,这让输入的父命令激活了仍然留在服务器中的Power Peg代码,接着八台服务器全部沦陷……最终,他们以每秒钟亏172222美元的速度亏损了4.65亿美元。

事后调查得知引发这起事故的主要原因在于一个长时间缺乏维护的代码库和一个缺乏流程规范的技术团队。导致问题的代码甚至已经8年没有维护使用过了。整个事故报告在这里。相关从业人员可以从中汲取教训,以避免类似的悲剧再次发生。

订阅更多文章

你可能感兴趣的: