程序员的一次失误,在 45 分钟里搞垮了一家上市公司
本篇文章2619字,读完约7分钟
如果有人告诉你一家大公司可以在45分钟内被摧毁,你可能会觉得有点可笑。但是工程师道格·七确实经历过这样的事情。
八年前,由于部署失败,奈特资本集团在短短45分钟内损失了4.6亿美元。
这是个真实的故事。
虽然doug seven没有参加活动,但他在随后的会议中不断提到devops、代码配置和持续交付的主题,希望让开发人员认识到部署的重要性。
这到底是怎么回事?道格七号在他的博客上分享了这个故事。
故事背景
这个故事的主角是一家名为奈特资本集团的美国全球金融服务公司,该公司从事市场营销、电子执行、机构销售和交易。
2012年,奈特是美国最大的股票交易商,在纽约证券交易所和纳斯达克拥有约17%的市场份额。奈特电子贸易集团(奈特Electronic Trading Group,etg)日均交易量超过33亿笔,日均交易量超过210亿美元。
各种数据表明,当时公司的经营和财务状况都很好。
2012年7月31日,奈特的资产约为3.65亿美元。
当时,纽约证券交易所正计划于2012年8月1日推出新的零售流动性计划。
为了准备这次活动,奈特 更新了他们的路由器。该路由器负责向市场发送订单以供执行。smars的核心功能之一是从knight 交易平台的其他组件接收订单(母订单),然后发送一个或多个子订单以供执行。换句话说,smars 将从交易平台接收大量订单,并将它们分成几个较小的订单,以便找到具有匹配库存数量的买家或卖家。父订单越大,生成的子订单就越多。
在smars中,有一个旧代码叫做“power peg”,已经有8年没有使用了,这次更新的目的是替换这个代码。更新后的代码重新调整了用于激活动力栓功能的旧标志的功能。
该代码已经过全面测试,并进行了一系列验证。一切看起来都很完美,没有理由犯错误。
复兴旧代码
从2012年7月27日 到2012年7月31日,奈特的开发人员每天都在公司的8台服务器上手动部署新软件。这是 秒文件中手动部署过程的内容。如果sec文件中有关于部署的内容,可能会出现严重错误。
然而,在部署新代码的过程中,一名骑士技术人员忘记将新代码复制到所有八个smars计算机服务器上——他漏掉了一个服务器。
没有第二个技术人员来检查此部署。
奈特的每个人都没有意识到第8台服务器上没有删除power peg代码,也没有添加新的rlp代码。奈特没有要求这种审查的书面程序。
2012年8月1日,东部时间上午9:30,市场开盘。奈特开始代表客户处理订单。
部署了正确smars的七台服务器开始正确处理这些订单。然而,发送到第8个服务器的命令触发了可支持的重用标志,并从死亡中恢复了旧的电源挂钩代码。
黑仔代码像僵尸一样攻击
权力挂钩代码用于在执行子订单时根据母订单计算购买或出售的股份。Power peg将指示系统在父订单完成后停止传输子订单。
也就是说,power peg跟踪子订单,并在父订单完成时停止它们。
2005年,奈特将这种累积跟踪功能移到了代码执行的早期阶段,从而从power peg中删除了计数跟踪。
当第8台服务器上的电源挂钩标志被激活时,电源挂钩功能开始发送子订单以供执行。但是,由于无法根据父订单跟踪共享金额,因此存在一个永无止境的循环。
地狱45分钟
想象一下,如果你有一个可以向市场发送自动和高速订单的系统,而没有任何跟踪程序来检查是否有足够的订单被执行,会发生什么。没有比这更糟糕的了。
当市场在早上9:30开盘时,人们很快就知道出事了。到上午9点31分,华尔街的许多人都知道发生了严重的事情。市场上满是成交量异常的股票订单。
到上午9点32分,华尔街的人们开始奇怪为什么订单没有停止,为什么没有人按下任何系统的关机开关。结果,他们发现开关没有关。在最初的 45分钟的交易中,奈特的交易量占总交易量的50%以上,这使得一些股票的市值增加了10%以上。因此,其他股票因错误交易而贬值。
更糟糕的是,奈特的系统在当天早些时候开始自动发送电子邮件。早在上午8:01,smar就已经处理了符合上市前交易条件的订单。邮件消息引用smars,并将错误标识为“电源锁定已禁用”。
上午8:01到9:30之间,奈特员工还收到了97封电子邮件。不幸的是,这些电子邮件不是作为系统警报设计的,所以没有人会立即查看它们。
在奈特的45分钟里,他们尝试了几种对策来防止错误的交易。因为没有终止开关,他们只能尝试在实时交易环境中诊断问题。
每分钟,大约有800万股股票在这个系统上交易。他们无法确定是什么导致了错误的命令,所以他们从正确部署的服务器上卸载了新代码。
换句话说,他们删除了工作代码,留下了损坏的代码。
这进一步放大了问题。最初,额外的父命令仅在错误部署的服务器上激活power peg代码。现在,问题已经扩散到所有服务器。最后,他们停止了系统,但此时,他们已经交易了45分钟。
开盘前45分钟,市场收到并处理了212份母公司订单。因此,smars向市场发送了数百万个子订单,导致400万笔交易,其中154只 股票的交易量超过3.97亿股。这意味着骑士资本集团在45分钟内造成了4.6亿美元的损失。
然而,奈特只有3.65亿美元的资产。
45分钟后,美国股市最大的交易商、纽约证券交易所和纳斯达克的主要做市商奈特(knight)破产,四个月后被getco llc收购。
软件发布必须是可重复和可靠的
所有开发和运营团队都应该从这一事件中吸取教训。构建优秀的软件并对其进行测试是不够的。您还必须确保它被正确地交付给市场,以便您的客户能够获得您交付的价值。
部署 smars的工程师不是唯一的负责人,knight 设定的流程与他们面临的风险不匹配。此外,他们的过程天生容易出错。在任何时候,如果您的部署过程依赖于人们积极阅读和遵循说明,您将面临风险。人们会犯错。错误可能出现在指令、指令解释或指令执行中。
部署需要自动化和可重复,以尽可能避免潜在的人为错误。如果奈特自动化了系统的部署并自动化了配置、部署和测试,这个错误是可以避免的。
即使没有实施完整的连续交付流程,您仍然需要遵守几个连续交付原则:
软件发布应该是一个可重复和可靠的过程。
尽可能实现自动化。
via:dougssove/2014/04/17/knight mare-a-devops-annually-tale/
雷锋网(公开号码:雷锋网)雷锋网
标题:程序员的一次失误,在 45 分钟里搞垮了一家上市公司
地址:http://www.qdgzw.com/kjcy/32658.html
免责声明:京青年创业网是一个专业为创业者提供学习交流的创业资讯媒体,更新的资讯来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2031@163.com,京青年创业网编辑将予以删除。