# 1.7 可信赖性
<!-- source: p0059 -->

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

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

- 检出的频率远高于程序员的预期；
- 并非只是在硬件错误的背景发生率上增加了一点；

<!-- source: p0060 -->

- 出现在功能逻辑中，而不是那些较容易用错误检测码发现问题的存储结构中；
- 可能在硬件安装很久之后才出现；
- 通常只影响特定核心，而不是整个多核芯片；
- 可能因多种原因突然且不可预测地出现，例如一次很小的软件改动，使原本很少使用的指令被更频繁地执行。

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

本节简要介绍可信赖性方面的问题；相关术语的正式定义和解决方法，留待附录 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 之和。

<!-- source: p0061 -->

MTBF 的倒数就是失效率。**年失效率（annual failure rate，AFR）**与以小时为单位的 MTBF 之间，关系如下：

$$
\mathrm{AFR}=1-e^{-365\times24/\mathrm{MTBF}}
$$

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

$$
\mathrm{AFR}=\frac{365\times24}{\mathrm{MTBF}}
$$

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

- **模块可用性（module availability）**衡量系统在服务正常与服务中断两种状态交替过程中，能够正常提供服务的程度。对于可修复的非冗余系统，模块可用性为：

$$
\text{模块可用性}
=\frac{\mathrm{MTTF}}{\mathrm{MTTF}+\mathrm{MTTR}}
$$

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

### 例：磁盘子系统的 MTTF {#example-disk-system}

**问题。** 假设一个磁盘子系统包含下列部件，其 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。

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

<!-- source: p0062 -->

$$
\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 就是失效率的倒数：

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

即略少于五年。

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

### 例：冗余电源的可靠性 {#example-redundant-power}

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

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

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

$$
\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}
$$

<!-- source: p0063 -->

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

$$
\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 倍。

[^afr-fit]: **译注：** 原文确实将 AFR 与 FIT 连在一起表述，但二者并非同一指标：上面的 AFR 是一年内失效的比例或概率，没有“每十亿小时”的量纲；FIT 则表示每十亿器件小时的失效次数。
