Linux md-RAID 如何处理磁盘读取错误?

Linux md-RAID 如何处理磁盘读取错误?

有2种情况:

  • 读取命令在内核级别超时(默认为 30 秒),
  • 驱动器报告无法读取给定扇区内核失去耐心(我感兴趣的情况)。

内核超时

由于驱动器访问通常通过 Linux SCSI 层,因此我认为超时情况完全由该层处理。根据本文档,它会在重置驱动器、总线、主机等后多次尝试该命令。如果这些都不起作用,SCSI 层将使设备脱机。此时,我认为 md 层只是“发现”一个驱动器消失了,并将其标记为丢失(失败)。它是否正确?

驱动器报告错误

某些驱动器可以配置为在达到特定超时后报告读取错误,从而中止内部恢复尝试。这就是所谓的欧洲研究委员会(或 TLER、CCTL)。磁盘超时通常配置为触发操作系统超时(或硬件 RAID 控制器),以便后者知道真正发生了什么,而不仅仅是“等待和中止”。

我的问题是:Linux(和 md)如何处理驱动器报告的读取错误?

它会再次尝试,做一些聪明的事情,或者只是将驱动器离线而不经历上面“内核超时”中描述的所有尝试?当这样的事情发生时,md 是否知道?

有些人建议ERC 在 Linux 上很危险,因为它不会给驱动器足够的时间来尝试恢复。他们还说 ZFS-raid 很好,因为如果发生读取错误,由于 RAID 冗余,它会计算丢失的不可读扇区数据,并且覆盖它回到驱动器上。然后,后者应该停止尝试读取令人讨厌的扇区,自动将其标记为坏扇区(不再使用),并将其重新映射到一个良好的正常扇区。

md也有这个能力吗?

答案1

md(4) 手册页的 部分对此进行了详细描述RECOVERY

[...] 读取错误将导致 md 尝试通过覆盖坏块来恢复。即它会从其他地方找到正确的数据,将其写入失败的块,然后尝试再次读回。如果写入或重新读取失败,md 将以与写入错误相同的方式处理错误,并使整个设备失败。

至于超时,虽然有报告称驱动器在待机状态下会被踢出,但我从未真正发生过这种情况。我有 7 个 HDD,它们通常会停止运转(因为主系统使用 SSD 运行,并且可以在很长一段时间没有 HDD 访问的情况下运行)并且它可以正常工作(除了唤醒md一个驱动器一个接一个地驱动器,而不是全部唤醒)一次)。

我想这取决于其他层向什么报告md

答案2

至于 TLER 是否危险,我认为不是。事实上,我仍然不敢相信这个功能曾经被需要过;任何驱动器都不应该花费那么长时间重试。即使只有 7 秒也足以让慢速 5400 rpm 驱动器重试数百次。如果你在几次(更不用说几百次)尝试后都无法做到这一点,那么你永远也做不到。

相关内容