一行代码,损失 6000 万美元!

你好,我是 EarlGrey,喜欢翻译点东西,偶尔写写代码。

点击下方卡片关注我,一起向上进击,提升自我。后台回复关键词“电子书”,送你一份我收藏的电子书合集。

1990 年 1 月 15 日,AT&T 的新泽西运营中心检测到大范围的系统故障,网络显示屏上出现了大量红色警告。

尽管试图排除故障,但网络故障仍持续了 9 个小时,导致呼叫连接故障率达到 50%。

AT&T 因此损失了 6000 多万美元,6 万多名美国人的电话完全无法接通。

此外,500 个航班延误,8.5 万人受到影响。

按理说,AT&T 的长途网络是高效率的典范,它利用先进的电子交换机和信号系统处理了全国大部分的电话。该系统通常能在几秒钟内完成电话路由选择。

然而,就在这一天,从纽约的一个交换机开始,整个网络出现了故障。这是由于最近一次更新中的一个软件错误造成的,该错误影响了网络中的 114 个交换机。当纽约的交换机复位并发出信号时,这个错误引发了多米诺骨牌效应,导致大范围的网络中断。

有趣的是,这个软件并没有经过测试。由于代码改动较小,因此按照管理层的要求绕过了测试。

问题所在

追根溯源,原因在于网络交换机实施的软件更新中出现了编码错误。

该错误发生在一个 C 语言程序中,涉及嵌套条件语句中一个错位的中断语句,导致数据覆盖和系统重置。

伪代码

1  while (ring receive buffer not empty 
          and side buffer not empty):

2    Initialize pointer to first message in side buffer
     or ring receive buffer

3    get copy of buffer

4    switch (message):

5       case (incoming_message):

6             if (sending switch is out of service):

7                 if (ring write buffer is empty):

8                     send "in service" to status map

9                 else:

10                    break // The error was here!

                  END IF

11           process incoming message, set up pointers to
             optional parameters

12           break
       END SWITCH


13   do optional parameter work

问题分析

  • 如果环写入缓冲区不是空的,那么第 7 行的 `if` 语句就会被跳过,取而代之的是第 10 行的中断语句。

  • 然而,为了使程序正常运行,本应执行第 11 行。

  • 当中断语句被执行,而不是处理传入的信息并为可选参数设置指针时,数据(本应保留的指针)就会被覆盖

  • 纠错软件识别出数据被覆盖,并启动关闭开关进行重置。由于网络中的所有交换机都使用了这种有缺陷的软件,导致了连锁重置反应,最终瘫痪了整个网络系统,使问题变得更加复杂。

尽管进行了严格的测试,网络的设计也非常灵活,但一行代码还是导致了半个国家的主要通信线路瘫痪。

修复

工程师们花了 9 个小时才使 AT&T 的系统完全恢复正常。他们主要是通过将交换机回滚到之前的代码工作版本来实现的。

实际上,软件工程师花了两周时间进行严格的代码阅读、测试和复制,才真正弄清了错误所在。

结论

对于 AT&T 来说,不幸的是,这还不是他们 90 年代最大的系统崩溃。在这十年的后期,他们还遇到了更多的问题。

今天的公司拥有更好的流程,但即便如此,还是会有漏洞漏网。谷歌撰写了一篇关于网站可靠性工程 20 年的精彩回顾文章,其中对 2016 年 YouTube 的首次全球故障进行了反思。

对于公司来说,故障的规模是巨大的,每次故障都会给我们带来教训。然而,对于大多数公司来说,故障归根结底是人为错误和流程漏洞造成的。

原文:https://engineercodex.substack.com/p/how-one-line-of-code-caused-a-60
转自:https://www.jdon.com/69737.htm

***

我创建了一个同名知识星球,目前会在星球内连载发布国外名家的文章和书籍,近期已更新了《埃里克叔叔谈个人成功的模型》前3章。星球和公众号内的所有翻译文章,均为个人学习使用,请勿用于商业用途。

e0aa847dad008ca0cd2855746b13e119.jpeg

后面我还会陆续增加其他内容和服务,欢迎大家监督和关注。

- EOF -

推荐阅读  点击标题可跳转

1、VS Code 变身小霸王游戏机!

2、认知升级:模型与范式转换

3、超赞的 Python 编译器,单核提速100倍

4、高效的终极秘诀

5、Python 3.12 版本有什么变化?


                                           分享、在看、点赞,3连645119a8202a232cc12db5a33ad536af.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值