# D.9 谬误与陷阱
<!-- source: p0917 -->

## 谬误：组件会迅速失效并停止工作

不少容错文献采用简化假设：组件一直完美运行，直到潜在错误激活，随后发生失效并停止工作。

Tertiary Disk 的经历恰好相反。许多组件在彻底失效很久之前就开始表现异常，通常须由操作员判断是否宣布它已失效。组件一般会继续违反服务约定，直到被操作员“终止”。

图 D.20 展示四个最终被停用的磁盘，在更换前多久开始异常。

| 失效磁盘的系统日志消息 | 日志条数 | 持续时间（小时） |
|---|---:|---:|
| 硬件失效：现场可更换单元的外围设备写故障。原文 `Hardware Failure (Peripheral device write fault [for] Field Replaceable Unit)` | 1763 | 186 |
| 未就绪：诊断失败，ASCQ 为现场可更换单元的组件 ID。原文 `Not Ready (Diagnostic failure: ASCQ = Component ID [of] Field Replaceable Unit)` | 1460 | 90 |
| 已恢复错误：现场可更换单元超过失效预测阈值。原文 `Recovered Error (Failure Prediction Threshold Exceeded [for] Field Replaceable Unit)` | 1313 | 5 |
| 已恢复错误：现场可更换单元超过失效预测阈值。原文 `Recovered Error (Failure Prediction Threshold Exceeded [for] Field Replaceable Unit)` | 431 | 17 |
{#fig-D.20 .wide .expand num="D.20" caption="Tertiary Disk 的 368 盘中，18 个月内被替换的四盘的系统日志记录［Talagala 和 Patterson 1999］。消息遵循 SCSI 规范，由设备驱动写入日志。有的盘在操作员更换前一周就出现消息。第三、第四项说明磁盘预测机制已检测到并预告即将失效，但操作员仍在数小时后才更换。"}

## 谬误：计算机系统确如广告所言，达到 99.999% 的“五个九”可用性

服务器公司的市场部门开始夸耀硬件可用性，宣称图 D.21 中 99.999% 的等级，即“五个九”；甚至操作系统公司的市场部门也试图让人有这种印象。

<!-- source: p0918 -->

| 每年不可用时间（分钟） | 可用性 | 可用性等级（九的个数） |
|---:|---:|---:|
| 50,000 | 90% | 1 |
| 5000 | 99% | 2 |
| 500 | 99.9% | 3 |
| 50 | 99.99% | 4 |
| 5 | 99.999% | 5 |
| 0.5 | 99.9999% | 6 |
| 0.05 | 99.99999% | 7 |
{#fig-D.21 .wide .expand num="D.21" caption="达到各可用性等级所对应的每年不可用分钟数，取自 Gray 和 Siewiorek［1991］。注意，五个九约等于每年不可用五分钟。"}

每年只中断五分钟当然令人印象深刻，但考虑调查中的实际失效数据，很难相信。例如 HP 声称，HP-9000 硬件与 HP-UX 能在“某些预先定义、预先测试的客户环境中”保证 99.999% 可用性［Hewlett-Packard 1998］。保证不包括操作员、应用和环境故障，而这些很可能已是主要故障类别；也不包括计划停机。系统未达承诺时，厂商承担什么经济处罚，同样不清楚。

Microsoft 也开展“五个九”营销。2001 年 1 月，www.microsoft.com 停机 22 小时；要把该网站可用性提高到 99.999%，此后 250 年都必须没有停机。

与宣传暗示不同，管理良好的服务器通常达到 99%–99.9% 可用性。

## 陷阱：功能实现在哪一层，会影响可靠性

理论上，把 RAID 放进软件没有问题；实践中，让它可靠运行却很难。

软件文化通常依赖连续版本与补丁，最终逐步达到正确；软件也难与其他层隔离。例如，正常运行往往依赖恰当的操作系统版本和补丁。因此，许多客户因软件 RAID 的缺陷或环境不兼容而丢失数据。

硬件当然也会有缺陷，但硬件文化通常更重视初始发布前的正确性测试；硬件也更可能独立于操作系统版本。

<!-- source: p0919 -->

## 谬误：操作系统最适合调度磁盘访问

ATA、SCSI 等高层接口向主机操作系统提供逻辑块地址。基于这种抽象，OS 最多只能尝试按逻辑地址递增排序。只有磁盘知道逻辑地址如何映射到扇区、磁道与盘面的物理几何，因而能降低旋转和寻道延迟。

例如有以下四次读取［Anderson 2003］：

| 操作 | 起始 LBA | 长度 |
|---|---:|---:|
| 读 | 724 | 8 |
| 读 | 100 | 16 |
| 读 | 9987 | 1 |
| 读 | 26 | 128 |

主机可能按逻辑块顺序重排：

| 操作 | 起始 LBA | 长度 |
|---|---:|---:|
| 读 | 26 | 128 |
| 读 | 100 | 16 |
| 读 | 724 | 8 |
| 读 | 9987 | 1 |

取决于数据实际位置，重排反而会恶化性能，如图 D.22。磁盘自行调度只需转 3/4 周，OS 调度却要三周。

![主机与磁盘的读取调度](/figures/app-d/fig-d-22.png)
{#fig-D.22 .wide .expand num="D.22" caption="OS 与磁盘调度的比较，分别标为 Host-ordered queue（主机排序队列）和 Drive-ordered queue（磁盘排序队列）。前者完成四次读取需要旋转三周，后者仅需 3/4 周［Anderson 2003］。"}

<!-- source: p0920 -->

## 谬误：系统中磁盘的平均寻道时间，等于跨越三分之一柱面数的寻道时间

这一误解把厂商销售磁盘时的指标与预期实际性能混为一谈，还错误地假定寻道时间与距离成正比。“三分之一距离”的经验规则，是在磁道很多、排除当前磁道的条件下，从一个随机位置到另一个随机位置的平均距离。过去厂商公布这一距离的寻道时间，便于一致比较；现在则计时全部寻道，再除以次数，计算“平均值”。若错误地认为寻道时间线性依赖距离，可用厂商公布的最短与“平均”时间作如下常见估计：

$$
\mathrm{Time}_{\mathrm{seek}}=\mathrm{Time}_{\mathrm{minimum}}+
\frac{\mathrm{Distance}}{\mathrm{Distance}_{\mathrm{average}}}
(\mathrm{Time}_{\mathrm{average}}-\mathrm{Time}_{\mathrm{minimum}}).
$$

这个谬误有两层。首先，寻道时间并不与距离线性相关。磁臂必须克服惯性加速，达到最大移动速度，在接近目标时减速，再等待振动停止，即稳定时间。有时还须暂停以控制振动。对于超过 200 个柱面的磁盘，Chen 和 Lee［1995］采用模型：

$$
\mathrm{SeekTime}(\mathrm{Distance})=
 a\sqrt{\mathrm{Distance}-1}+b(\mathrm{Distance}-1)+c.
$$

针对每种盘选择 \(a,b,c\)，使公式吻合距离为 1、最大距离、最大距离三分之一时的标称时间。图 D.23 比较该式与错误的线性公式；平方根项体现了加减速。

第二，规格中的平均值只有在磁盘活动没有局部性时才适用。幸运的是，磁盘访问既有时间局部性，也有空间局部性（见附录 B 第 B-2 页）。图 D.24 是 UNIX 分时与业务处理两种负载的寻道距离样本。注意两者都有很高比例访问同一柱面，即图中距离 0。可见这个谬误极具误导性。

<!-- source: p0921 -->

![寻道距离与寻道时间模型](/figures/app-d/fig-d-23.png)
{#fig-D.23 .wide .expand num="D.23" caption="较精细模型与简单线性模型的寻道时间—距离关系。Chen 和 Lee［1995］发现，图中参数 a、b、c 的表达式对多种磁盘都适用。横轴为寻道距离，纵轴为访问时间（ms）；Naive seek formula 为简单公式，New seek formula 为新公式。"}

图内参数公式转写如下，其中 \(N\) 表示柱面数：

$$
a=\frac{-10T_{\min}+15T_{\mathrm{avg}}-5T_{\max}}{3\sqrt N},\qquad
b=\frac{7T_{\min}-15T_{\mathrm{avg}}+8T_{\max}}{3N},\qquad
c=T_{\min}.
$$

![两种工作负载的寻道距离分布](/figures/app-d/fig-d-24.png)
{#fig-D.24 .wide .expand num="D.24" caption="两种系统的寻道距离测量样本。左为 UNIX 分时系统，右为调度磁盘访问以提高吞吐量的业务处理应用。距离 0 表示同一柱面；其他数值表示纵轴相邻界限之间的累计比例。例如右图标 16 的柱为 11%，表示跨越 1–16 柱面的寻道占 11%。UNIX 只测到 1000 柱面中的 200，但覆盖 85% 访问；业务负载跟踪全部 816 柱面。图外占比至少 1% 的距离，仅有 224 占 4%，以及 304、336、512、624 各占 1%。总计 94%，其余为其他类别中小而非零的比例。数据由 Seagate 的 Dave Anderson 提供。横轴为寻道比例，纵轴为寻道距离。"}
