首页 › 案例
骑士资本(Knight Capital) · 2012

第八台服务器

新代码装上了七台服务器,漏了第八台。45 分钟,亏掉 4.6 亿美元。

◷ 约 2 分钟

2012 年 8 月 1 日早上 8 点 01 分,骑士资本的一组员工收到一封系统邮件,内容是「Power Peg disabled」。接下来一个半小时,又来了 96 封。没人理会。这类邮件平时大家基本不看,它从设计上就不是警报。

骑士可不是小公司。按美国证监会的说法,美国上市股票的全部成交里,大约十分之一经过它的手。而这些邮件指向的问题,开盘不到一小时,就差点让这家公司垮掉。

那天,纽约证券交易所上线了一个服务散户小额订单的新项目,骑士为此更新了自己的订单路由系统。新代码借用了一个旧开关,这个开关原本用来启动一个叫 Power Peg 的老功能。Power Peg 从 2003 年起就不用了,但一直没人把它删掉。

此前几天,从 7 月 27 日起,一位技术员把新代码逐台装到路由系统的服务器上。服务器一共八台,代码装上了七台。没有第二个人检查,也没有哪条书面规定要求有人检查。

9 点半开盘,身后是 97 封没人处理的报错邮件。在第八台服务器上,那个旧开关把 Power Peg 叫醒了。早在 2005 年,Power Peg 里负责「已经买了多少股」的计数功能被挪到了代码的别处,所以它现在不知道什么时候该停。收到 212 笔客户小单,它往市场里发出了几百万笔订单。骑士订单系统的另一部分其实已经认出这些客户订单都成交了,可这个消息没有传到路由系统。美国证监会后来认定,骑士也没有任何流程,能在路由系统自己行为异常时让它停下。

系统还连着市场在下单,工程师们一边盯着一边找问题。他们试的一个办法,是把那七台正常服务器上的新代码撤掉。结果更糟:现在八台全在跑 Power Peg。

大约 45 分钟里,骑士在 154 只股票上成交了 3.97 亿股。等终于停下来,它手里多了 35 亿美元本不想买的股票,还卖空了 31.5 亿美元本不想卖的。把这些头寸平掉,亏了 4.6 亿美元。

不到三周前,骑士的股价还在 12 美元以上。出事五天后,一群投资人拿出 4 亿美元救命,换走了公司七成以上的股份。第二年夏天,骑士和对手 Getco 合并成一家新公司 KCG。

美国证监会后来罚了它 1200 万美元。处罚决定里写着:如果有一条书面流程,要求部署后做一道「简单的复核」,就能发现漏掉的那台服务器,整件事本可以避免。

这件事里藏着几个道理

职责分离与四眼原则一个技术员给八台服务器装代码,没人复核,也没有哪条书面规定要求复核。检查清单美国证监会事后写道:部署时只要有一道「简单的复核」,就能发现漏掉的那台。安灯绳开盘前系统发出了 97 封报错邮件。它们本来就不是按警报设计的,所以没人喊停。瑞士奶酪模型没删的旧代码、挪作他用的开关、漏装的一台、没人处理的邮件,还缺乏有效的停单控制和应急处置程序。好几层防护,在同一个早上一起失效。正常事故理论机器以毫秒为单位下单,人还没弄清哪里出错,非预期的头寸已经迅速累积到几十亿美元。自働化骑士系统的另一部分已经知道这些客户订单成交了,消息却没传到路由系统。美国证监会认定,骑士没有任何流程能在路由系统自己行为异常时让它停下。

出处

  1. SEC, In the Matter of Knight Capital Americas LLC, Release No. 70694, October 16, 2013
  2. Reuters via NBC News, Knight Capital gets $400 million lifeline, August 6, 2012