跳转到主要内容

1.7 可信赖性

历史上,集成电路一直是计算机中最可靠的部件之一。它们的引脚可能容易受损,通信通道也可能发生故障,但芯片内部的失效率很低。对于特征尺寸为 5 nm 及以下的工艺,这一传统认识正在改变:瞬态故障与永久性故障都越来越常见,体系结构设计者必须在系统设计中应对这些挑战。存储系统长期以来就需要处理瞬态错误,例如某个比特发生翻转,以及永久性错误,例如存储单元损坏;如今,芯片内部的逻辑电路也开始出现问题。

事实上,研究人员发现,每一千台服务器中,会有少数几个被他们称为 mercurial cores 的核心(Dixit, 2021; Hochschild, 2021; Trippel, 2022)。这些核心在执行某些指令时会反复出错,只有把指令的实际结果与预期结果进行比较,才能发现问题。这类**静默数据错误(silent data errors)**或 silent corrupt execution errors 具有以下特点:

  • 检出的频率远高于程序员的预期;
  • 并非只是在硬件错误的背景发生率上增加了一点;
  • 出现在功能逻辑中,而不是那些较容易用错误检测码发现问题的存储结构中;
  • 可能在硬件安装很久之后才出现;
  • 通常只影响特定核心,而不是整个多核芯片;
  • 可能因多种原因突然且不可预测地出现,例如一次很小的软件改动,使原本很少使用的指令被更频繁地执行。

研究人员建议采用软件缓解措施来应对静默错误,同时要求硬件制造商构建更稳健的硬件,或许可以借鉴大型机采用的错误检查技术。还有研究者建议,通过加强扫描测试和系统级测试,改进制造后的测试。

本节简要介绍可信赖性方面的问题;相关术语的正式定义和解决方法,留待附录 D 的 D.3 节讨论。

计算机是在不同抽象层次上设计和构建的。我们可以沿着一台计算机逐层向下展开:在上一层看似一个部件的东西,在下一层就成为完整的子系统,如此递归,最终抵达单个晶体管。有些故障影响广泛,例如断电,但许多故障可以局限在一个模块的某个部件中。因此,某一层次上整个模块的彻底失效,在更高层模块看来,可能只是一处部件错误。理解这一差别,有助于寻找构建可信赖计算机的方法。

一个难题是:如何判定系统正在正常运行?随着互联网服务普及,这一理论问题变成了现实问题。基础设施提供商开始提供服务水平协议(SLA)或服务水平目标(SLO),承诺网络或供电服务的可信赖程度。例如,如果某个月有若干小时未满足协议约定,就向客户支付赔偿。因此,可以用 SLA 来判定系统究竟处于正常服务状态,还是停机状态。

相对于一份 SLA,系统会在两种服务状态之间交替:

  1. 服务正常(service accomplishment):按约定提供服务。
  2. 服务中断(service interruption):提供的服务不符合 SLA。

两种状态之间的转换,分别由**失效(failure)和恢复(restoration)**引起:前者使系统从状态 1 进入状态 2,后者则从状态 2 返回状态 1。对这些转换进行量化,可以得到可信赖性的两项主要度量:

  • **模块可靠性(module reliability)**衡量从某个参考起始时刻起,服务连续正常提供的情况;等价地,也可以考察直到发生失效所经历的时间。因此,**平均失效前时间(mean time to failure,MTTF)是可靠性的一项度量。服务中断时间用平均修复时间(mean time to repair,MTTR)**衡量。**平均失效间隔时间(mean time between failures,MTBF)**则是 MTTF 与 MTTR 之和。

MTBF 的倒数就是失效率。**年失效率(annual failure rate,AFR)**与以小时为单位的 MTBF 之间,关系如下:

AFR=1−e−365×24/MTBF \mathrm{AFR}=1-e^{-365\times24/\mathrm{MTBF}}

如果 MTBF 很大,或者等价地说 AFR 很小,则可以近似为:

AFR=365×24MTBF \mathrm{AFR}=\frac{365\times24}{\mathrm{MTBF}}

原文接着指出,AFR 通常用每十亿小时运行中的失效次数来报告,即 FIT(failures in time)。1 因此,1,000,000 小时这样很大的 MTTF,大约对应 109/10610^9/10^6,即 1000 FIT。如果一组模块的寿命都服从指数分布,也就是说,模块已使用多久并不影响其失效概率,那么,这组模块的总体失效率就是各模块失效率之和。

  • **模块可用性(module availability)**衡量系统在服务正常与服务中断两种状态交替过程中,能够正常提供服务的程度。对于可修复的非冗余系统,模块可用性为:
模块可用性=MTTFMTTF+MTTR \text{模块可用性} =\frac{\mathrm{MTTF}}{\mathrm{MTTF}+\mathrm{MTTR}}

注意,现在“可靠性”和“可用性”都是能够量化的指标,而不是“可信赖性”的同义词。根据这些定义,只要对部件可靠性作出一些假设,并假定各次失效相互独立,就能定量估算系统可靠性。

例:磁盘子系统的 MTTF

问题。 假设一个磁盘子系统包含下列部件,其 MTTF 分别如下:

  • 10 块磁盘,每块的额定 MTTF 为 1,000,000 小时;
  • 1 个 ATA 控制器,MTTF 为 500,000 小时;
  • 1 个电源,MTTF 为 200,000 小时;
  • 1 个风扇,MTTF 为 200,000 小时;
  • 1 根 ATA 电缆,MTTF 为 1,000,000 小时。

采用寿命服从指数分布、各部件失效相互独立这两个简化假设,计算整个系统的 MTTF。

解答。 各部件失效率之和为:

系统失效率=10×11,000,000+1500,000+1200,000+1200,000+11,000,000=10+2+5+5+11,000,000 小时=231,000,000 小时=23,0001,000,000,000 小时 \begin{aligned} \text{系统失效率} &=10\times\frac{1}{1{,}000{,}000} +\frac{1}{500{,}000} +\frac{1}{200{,}000} +\frac{1}{200{,}000} +\frac{1}{1{,}000{,}000}\\ &=\frac{10+2+5+5+1}{1{,}000{,}000\ \text{小时}}\\ &=\frac{23}{1{,}000{,}000\ \text{小时}} =\frac{23{,}000}{1{,}000{,}000{,}000\ \text{小时}} \end{aligned}

也就是 23,000 FIT。系统的 MTTF 就是失效率的倒数:

MTTFsystem=1系统失效率=1,000,000,000 小时23,000=43,500 小时 \mathrm{MTTF}_{\mathrm{system}} =\frac{1}{\text{系统失效率}} =\frac{1{,}000{,}000{,}000\ \text{小时}}{23{,}000} =43{,}500\ \text{小时}

即略少于五年。

应对失效的主要方法是冗余,可以是时间上的冗余,也可以是资源上的冗余。时间冗余是重复执行操作,观察是否仍会出错;资源冗余则是准备其他部件,在某个部件失效时接替它。一旦部件被更换,系统得到完全修复,就假定它的可信赖性恢复到如同新系统一样。下面用一个例子量化冗余的收益。

例:冗余电源的可靠性

问题。 磁盘子系统经常采用冗余电源来提高可信赖性。使用上一例的部件与 MTTF 数值,计算冗余电源的可靠性。假设一个电源就足以让磁盘子系统运行,现在再增加一个冗余电源。

解答。 我们需要一个公式,来表示系统在容忍一次失效后仍可提供服务时,能够获得怎样的可靠性。为简化计算,假设各部件的寿命服从指数分布,且失效相互独立。冗余电源组的 MTTF,等于其中一个电源首次失效前的平均时间,除以第一个电源被更换之前,另一个电源也失效的概率。因此,如果修复之前发生第二次失效的概率很小,这对电源的 MTTF 就会很大。

由于有两个电源,且失效相互独立,直到其中一个失效的平均时间为 MTTFpower supply/2\mathrm{MTTF}_{\mathrm{power\ supply}}/2。第二个电源在此期间也失效的概率,可以较好地近似为 MTTR 除以另一个电源的平均失效前时间。因此,一对冗余电源的 MTTF 可以合理地近似为:

MTTFpower supply pair=MTTFpower supply/2MTTRpower supply/MTTFpower supply=MTTFpower supply2/2MTTRpower supply=MTTFpower supply22×MTTRpower supply \begin{aligned} \mathrm{MTTF}_{\mathrm{power\ supply\ pair}} &=\frac{\mathrm{MTTF}_{\mathrm{power\ supply}}/2} {\mathrm{MTTR}_{\mathrm{power\ supply}}/ \mathrm{MTTF}_{\mathrm{power\ supply}}}\\ &=\frac{\mathrm{MTTF}_{\mathrm{power\ supply}}^2/2} {\mathrm{MTTR}_{\mathrm{power\ supply}}}\\ &=\frac{\mathrm{MTTF}_{\mathrm{power\ supply}}^2} {2\times\mathrm{MTTR}_{\mathrm{power\ supply}}} \end{aligned}

采用前面的 MTTF 数值,并假设人工发现电源失效并将其更换,平均需要 24 小时,那么,这对容错电源的可靠性为:

MTTFpower supply pair=MTTFpower supply22×MTTRpower supply=200,00022×24≈830,000,000 小时 \mathrm{MTTF}_{\mathrm{power\ supply\ pair}} =\frac{\mathrm{MTTF}_{\mathrm{power\ supply}}^2} {2\times\mathrm{MTTR}_{\mathrm{power\ supply}}} =\frac{200{,}000^2}{2\times24} \approx830{,}000{,}000\ \text{小时}

因此,这对电源的可靠性约为单个电源的 4150 倍。


  1. 译注: 原文确实将 AFR 与 FIT 连在一起表述,但二者并非同一指标:上面的 AFR 是一年内失效的比例或概率,没有“每十亿小时”的量纲;FIT 则表示每十亿器件小时的失效次数。 ↩︎