【译文】一行代码如何造成 6000 万美元的损失
内容提要
1990年1月15日,AT&T系统故障导致电话无法接通,航班延误,损失超过6000万美元。故障由软件更新中的编码错误引起,工程师花了9个小时修复系统。故障原因是流程失败和人为错误。
延伸解读
一行代码如何引发全网连锁重置
文章指出,错误源于C语言嵌套条件语句中一个错位的中断语句。当ring写缓冲区非空时,本应执行的处理逻辑被跳过,导致指针数据被覆盖。交换机检测到数据覆盖后触发重置,而所有交换机都运行同一缺陷软件,于是重置像多米诺骨牌一样扩散,最终瘫痪半个国家的通信。这说明在高度耦合的系统中,局部逻辑错误可能被网络效应放大。
严格测试为何没拦住这个错误
AT&T以严格测试闻名,补丁也经过层层测试,但错误依然漏网。文章强调,根本原因不是那一行代码本身,而是流程失败和人为错误。这提示读者:再完善的测试流程也可能存在盲区,尤其是涉及复杂状态和边界条件的场景。事后工程师花两周进行代码阅读、测试和复制才定位问题,也说明故障排查成本远高于预防成本。
恢复靠回滚,但定位靠深挖
故障持续9小时,工程师主要通过将交换机回滚到之前的代码版本恢复系统。然而,真正弄清错误所在却花了两周时间。这种“先恢复、后定位”的做法在重大故障中很常见:优先恢复服务,再深入分析根因。文章借此提醒,回滚能快速止血,但不能替代对流程漏洞的彻底复盘,否则类似问题可能再次发生。
Q&A
1990年AT&T系统故障造成了哪些具体影响?
1990年1月15日,AT&T系统故障持续9小时,导致呼叫连接故障率达50%,6万多名用户电话完全无法接通,500个航班延误,8.5万人受影响,经济损失超过6000万美元。
AT&T网络故障的根本原因是什么?
根本原因是软件更新中的编码错误:在C语言程序的嵌套条件语句中,一个错位的中断语句(break)导致数据覆盖和系统重置。此外,文章指出这本质上是流程失败和人为错误。
一行代码是如何导致整个网络瘫痪的?
错误代码位于交换机软件中:当ring写缓冲区非空时,程序执行了错误的break语句,跳过了本应处理消息和设置指针的步骤,导致数据被覆盖。系统检测到数据覆盖后启动重置,由于所有交换机使用相同缺陷软件,引发连锁重置反应,最终瘫痪整个网络。
工程师是如何修复AT&T系统故障的?
工程师花了9小时将交换机回滚到之前的代码工作版本来恢复系统。软件工程师另外花了两周时间进行严格的代码阅读、测试和复制,才真正定位错误。
为什么经过层层测试的软件补丁仍未被发现错误?
文章指出该补丁经过了层层测试却未被发现,而AT&T以严格测试闻名,这一事件尤其令人吃惊。但文章未详细说明测试为何遗漏该错误。
AT&T在90年代还发生过类似系统崩溃吗?
是的,文章提到对于AT&T来说,这还不是他们90年代最大的系统崩溃,在这十年的后期他们还遇到了更多问题。