4

几年前的一些具有里程碑意义的研究现在表明,大型数据集中的无声损坏比以前预期的要广泛得多(今天我猜你会说它比普遍意识到的要多)。

假设应用程序和操作系统编写了一个扇区并且有时间让所有内容刷新,没有崩溃或异常关闭,也没有会命令保存错误数据的软件错误。

稍后,一个扇区被读回,并且没有从 HDD 读取错误。但它包含错误的数据。

由于 HDD 数据编码包含纠错码,我认为任何神秘的状态更改通常都会被检查注意到。即使检查不是很严格,因此会出现一些错误,但仍然会检测到更多的错误,这些错误会告诉您驱动器有问题。但这并没有发生:显然,数据被发现是错误的,没有任何症状。

怎么会这样?

我在台式机上的经验是,有时曾经好的文件后来发现是坏的,但这可能是由于在写入过程中没有注意到的问题,无论是移动扇区还是文件系统跟踪数据。关键是,在写入时可能会引入错误,其中数据在 HDD(或 RAID 硬件)内部被损坏,因此错误的数据被写入与其纠错码匹配。如果这是(唯一的)原因,那么一次验证应该足以表明它确实写得很好。

或者,数据在磁盘上显示正常后是否会变坏?即验证一次,一切正常;稍后验证并发现错误,此时该扇区尚未在中间写入。我认为这就是意思,因为通过改进的刷新检查可以很容易地处理写入时错误。

那么,如何在不触发数据附带的纠错码的情况下发生这种情况呢?

4

3 回答 3

4

可能会发生静默数据损坏的某些方式:

  • 写入数据之前内存中的损坏(在这种情况下,如果校验和是在损坏之后计算的,即使是文件系统级别的校验和也无济于事)
  • SATA 电缆中偶然匹配校验和的错误
  • 磁盘驱动器缓存内存中的位翻转(不确定是否已校验和,可能取决于品牌和型号)
  • 写入前损坏数据的驱动器固件中的错误(校验和与损坏的数据匹配)
  • 偶然匹配校验和的磁盘块损坏
  • 读取将损坏的数据返回到驱动器控制器,该数据偶然与校验和匹配
  • 验证校验和后损坏数据的固件中的错误
  • 数据移到那里后主存损坏
  • 处理数据的软件中的错误(尽管这通常不被视为此列表的一部分,但被归类为软件错误)

偶然匹配其错误代码的腐败本身是非常不可能的,但大量数据和生日悖论确保它们确实发生。今天的驱动器一直存在内部读取错误,并且严重依赖校验和来捕获它们。如果是这样,他们只是重新读取该扇区,直到读取良好,如果扇区变得太糟糕,他们会默默地将其与备用扇区交换。如果在从 SATA 电缆读取数据时发生校验和错误,SATA 控制器也可能会静默地重新发送数据。

通过使用更长的校验和,可以任意减小仍然匹配校验和的随机损坏的机会,但这涉及更多的存储和处理开销。对于 SATA 等标准化协议,您不能只更改校验和大小而不破坏兼容性。并且没有协议或磁盘级别的校验和可以使您免受固件错误或其他软件错误的影响。

像 ZFS/Btrfs 这样的文件系统级校验和的一大优势是它们可以捕获所有这些错误,除了主内存损坏(使用 ECC 内存来防止这种情况)和软件错误。他们可以使用比单个磁盘块更大的校验和块大小,以减少较长校验和的存储开销。

于 2017-11-21T12:50:27.983 回答
2

请参阅http://en.wikipedia.org/wiki/Silent_data_corruption#Silent_data_corruption,它提供了充分的解释。我还想提一下生日悖论,它解释了为什么错误的概率比直觉预期的要高。请参阅http://en.wikipedia.org/wiki/Birthday_paradox

写入时,计算一个扇区的 CRC 并将其写入磁盘。读取时,数据与 CRC 一起被读取。CRC 是根据从磁盘读取的数据重新计算的,然后与从磁盘读取的 CRC 进行比较。

在磁盘级别可能出现问题但会被检测到: - 一个或多个数据位未正确写入。- 一个或多个 CRC 位未正确写入磁盘。- 两者都已正确写入磁盘,但后来损坏。- 两者都已正确写入,但控制器坏了或有问题。

磁盘上可能出现的问题但未被检测到(静默错误): - 数据或 CRC 已损坏,因为磁盘上写入错误或由于无效扇区而在读取时损坏,但是(尽管概率很低)计算的 CRC 与 CRC 匹配从设备中读取。这就是生日悖论发挥作用的地方。

通过磁盘: - 控制器从磁盘正确读取数据,但通过 SATA 电缆错误地将数据传输到内存。我假设 SATA 具有某种类型的纠错功能,但同样,您可以在此处重复该过程。- 数据从磁盘传输到控制器并通过 SATA 电缆,但内存位倒置。

于 2015-02-16T05:34:59.187 回答
2

一种类型的无声损坏是由于许多硬盘驱动器本身具有一点写入缓存(不同于磁盘控制器和/或操作系统上的缓存)这一事实引起的。

对于这个硬盘内部缓存,在大多数情况下,它不是断电安全的。即,如果有人在高 I/O 写入速率操作期间拔掉插头,硬盘驱动器缓存中的数据就会丢失。

例如,在我工作过的基于戴尔的高端数据库企业服务器上,如果有人在繁重的写入操作正在进行时(可能有 50% 的时间)不小心拔掉了插头,我们就有很高的数据库损坏的可能性。我们现在的标准操作程序是禁用硬盘内部缓存(禁用磁盘控制器缓存,或者在磁盘控制器级别设置写回缓存并没有为我们关闭硬盘内部缓存)

有关详细信息和检测此问题的测试工具,请参阅http://brad.livejournal.com/2116715.html

请注意,操作系统崩溃不会导致这种损坏。只是电源故障。

于 2015-08-24T01:51:43.053 回答