硬盘/SSD - 错误检测和处理 - 是否可靠地防止静默数据损坏?

硬盘/SSD - 错误检测和处理 - 是否可靠地防止静默数据损坏?

当驱动器上发生错误时,是否可以正确地假设它始终会被检测到并作为读取失败报告给操作系统(如果是软件 RAID,例如 mdadm)或 RAID 控制器(如果是硬件 RAID)(即它不会默默地返回损坏的数据),然后 RAID 软件/控制器将接受这一事实并使用 RAID 中的其他驱动器来读取数据(假设它是具有冗余的 RAID 类型)?

据我所知,现代企业级驱动器已配备错误检测方案,因此我假设情况确实如此,但在网上找不到任何确凿的证据。我想这个答案在一定程度上取决于驱动器内置的错误检测质量,因此如果这很重要,那么我最感兴趣的是英特尔 DC S3500 系列 SSD。

编辑于 2015 年 6 月 5 日 - 澄清:

具体来说,我想知道当今用于检测错误的算法是否万无一失。举一个简单的例子,如果错误检测只是对扇区中的所有位进行异或运算,那么如果两个位被翻转,错误就不会被检测到。我想它们要先进得多,但我想知道错误未被发现的几率是多少,如果几率很低,我们甚至不需要担心它,以及是否有一些权威来源或值得信赖的文章可以引用。

编辑于 2015 年 6 月 10 日

更新了问题标题和问题正文,使其更符合磁盘错误的概念(不再像原来那样以 mdadm 为中心)。

答案1

硬盘确实有多种纠错方法来防止数据损坏硬盘被分成多个扇区,其中一些扇区可能完全无法写入/读取,或通过数据损坏返回错误数据 - 我们称第一个坏扇区损坏后者静默数据损坏

坏扇区损坏

第一次损坏已经由驱动器本身通过多种方式处理。在工厂,每个制造的驱动器都会进行坏扇区测试,然后将其放入主要缺陷列表 (p-list)在驱动器正常使用过程中,内部系统可能会因正常磨损而发现更多坏扇区 - 这些坏扇区被放入生长缺陷列表 (g-list)。有些驱动器甚至有更多列表,但这两个是最常见的。

驱动器本身通过将对硬盘驱动器扇区的访问重新映射到备用扇区无需通知操作系统。但是,每次重新映射时,硬盘 SMART 系统中的相应值都会增加,从而表明硬盘磨损越来越严重。要查找的指标是 SMART 5 - 重新分配的扇区数,而其他重要的指标是 187(报告的不可纠正错误)、197(当前待处理扇区数)和 198(脱机不可纠正)。

为了找到坏扇区,硬盘使用内部错误修正码 (ECC),可用于确定特定扇区中数据的完整性。这样,它可以检查扇区中的写入和读取错误,并在必要时更新 g 列表。

来源

静默数据损坏

由于我们确实有相当多的内部数据完整性检查,静默数据损坏应该非常罕见——毕竟,硬盘承担着可靠地保存数据的任务,它们应该正确地完成这项工作。

为了将用户请求的读取或写入之外的静默数据损坏量保持在最低限度,RAID 系统会定期检查整个驱动器的 ECC 以更新 g 列表(数据清理)。如果发生错误,则在检查扇区ECC后从另一个RAID成员重建数据。

但是,所有数据校正和完整性检查都必须在某个地方完成 - 固件。这些低级程序中的错误仍可能导致问题,机械问题和误报 ECC 总和也可能导致问题。一个例子是未经检查的写入,固件错误地报告写入成功,而实际的硬盘写入并未发生或有故障(身份差异)。

有一些关于这些故障的统计发生情况的研究,其中文件系统数据完整性检查确实报告了故障,而底层驱动器没有报告问题,因此显示出无声数据损坏。

结论:在 17 个月的时间跨度内,共检查了 150 万个磁盘(总共 365 个磁盘存在身份差异),平均而言,消费级磁盘中不到 0.3% 的磁盘和企业级磁盘中不到 0.02% 的磁盘存在此类身份差异 - 请参阅表 10 和第 5 节本出版物

来源

答案2

是的,mdadm 将检测到此类错误,将故障驱动器标记为有缺陷,并将其从工作阵列中删除,如果有冗余,则工作阵列将继续以降级模式运行。

但据我所知,mdadm 在“软件”级别执行此操作,基于它响应其通用 I/O 请求(适用于任何驱动器)从驱动器接收到的错误,而不是通过查询特定于驱动器的错误检测功能。

答案3

嗯,事情有点复杂。

现代硬盘不仅能检测错误,它们还有一些备用扇区和智能控制器,它们会尝试重新定位坏扇区。也就是说,当您尝试读取某个逻辑扇区但第一次没有读取成功时,控制器会尝试多次读取,有时在重试几次后可以读取;然后它将数据写回备用扇区,将逻辑扇区重新映射到新扇区并将旧扇区标记为坏扇区,最后将数据返回给您。所有这些过程对读取器来说都是完全透明的,您不会注意到任何错误。然而,这通常会反映在 SMART 统计数据中,如果这种情况越来越频繁地发生,您可以在硬盘真正发生故障之前就发现它即将发生故障。这就是为什么在系统上使用 SMART 监控工具非常重要的原因。

当某个扇区根本无法读取,或者控制器用完了备用扇区时,驱动器将返回读取错误。错误检测现在非常可靠,它使用某种 CRC 来处理扇区数据。当返回读取错误时,mdadm 将看到它,将驱动器标记为不可用,并将阵列切换为降级模式。

相关内容