带有屏障的 SATA 驱动器上写入缓存的安全性

带有屏障的 SATA 驱动器上写入缓存的安全性

我最近一直在阅读有关 SATA 驱动器的写入缓存、NCQ、固件错误、障碍等内容,我不确定在电源故障的情况下什么最佳设置可以保证我的数据安全。

据我所知,NCQ 允许驱动器重新排序写入以优化性能,同时让内核了解哪些请求已被物理写入。

写入缓存使驱动器响应请求的速度更快,因为它不需要等待数据写入物理磁盘。

我不确定 NCQ 和写入缓存在这里如何混合......

文件系统(尤其是日志式文件系统)需要确定特定请求何时被记录下来。此外,用户空间进程使用 fsync() 强制刷新特定文件。直到文件系统确定数据已写入磁盘后,对 fsync() 的调用才应返回。

有一个功能(FUA,强制单元访问),我只在 SAS 驱动器上见过,它会强制驱动器绕过缓存并直接写入磁盘。对于其他所有东西,都有写入屏障,这是内核提供的一种机制,可以触发驱动器上的缓存刷新。这会强制全部要写入的不仅仅是关键数据,还有缓存,因此如果滥用(例如 fsync()),就会降低整个系统的速度。

然后,有些驱动器存在固件错误,或者故意谎报数据的物理写入时间。

话虽如此,有几种方法可以设置驱动器/文件系统:A)NCQ 和写缓存禁用 B)仅启用 NCQ C)仅启用写缓存 D)同时启用 NCQ 和写缓存

我假设障碍已启用..顺便问一下,如何检查它们是否真的启用了?

如果发生断电,同时正在主动写入磁盘,我猜测选项 B(NCQ,无缓存)对于文件系统日志和数据都是安全的。但可能会有性能损失。

如果使用屏障或 FUA,选项 D(NCQ+缓存)对于文件系统日志和使用 fsync() 的应用程序来说是安全的。但对于在缓存中等待的数据来说,这很糟糕,文件系统需要检测它(校验和),至少文件系统不会(希望)处于不稳定状态。从性能方面来看,它应该更好。

但是,我的问题是...我遗漏了什么吗?还有其他变量需要考虑吗?是否有任何工具可以确认这一点,并且我的驱动器可以正常运行?

答案1

对于直接的企业系统,还有一个额外的层,即存储适配器(几乎总是 RAID 卡),上面还有另一层缓存。如今,存储堆栈中有很多抽象,我在博客系列中对此进行了深入的详细介绍了解你的 I/O

RAID 卡可以绕过磁盘缓存,其中一些甚至允许在 RAID BIOS 中切换此功能。这就是为什么企业磁盘是企业,其固件允许消费者驱动器(尤其'绿色'驱动器)则不会。此功能直接解决了您所担心的情况:电源故障且未提交写入。RAID 卡缓存(应为电池或闪存备份)将保留,直到电源恢复并且可以重新提交这些写入。

某些企业级 SSD 包含一个板载电容器,该电容器具有足够的能量在完全断电之前提交板载缓存。

如果您使用的系统磁盘直接连接到主板,则保证会更少。除非磁盘本身能够提交写入缓存,否则电源故障确实会造成损失。文件系统由于无法承受这种故障模式而获得了不可靠的名声;它被设计为在具有工程存储生存能力的完整企业系统上运行。

然而,随着时间的流逝,XFS 的设计已经能够解决这个问题。其他主要的 Linux 文件系统(以及在 Windows 上)工程设计以应对这种故障模式。其工作原理是丢失的写入不会出现在 FS 日志中,并且它会知道它们没有被提交,因此可以安全地检测到损坏并进行解决。

您确实指出了这里的一个问题:磁盘固件存在问题。在这种情况下,FS 日志将做出与现实不符的错误假设,并且可能在一段时间内无法检测到损坏。奇偶校验 RAID 和镜像 RAID 可以解决这个问题,因为应该有另一个已提交的副本可供提取。但单磁盘设置不会进行交叉检查,因此实际上会出现故障。

您可以通过使用经过更多验证(并针对您假定的工作负载模式进行测试)的企业级驱动器,并设计您的存储系统以使其能够承受此类谎言来规避固件风险。

答案2

文件系统日志最初会等待日志写入完成后再发出元数据写入,假设没有驱动器写入缓存。启用驱动器写入缓存后,此假设将被打破,并可能导致数据丢失。因此,创建了屏障。有了屏障,日志可以确保日志写入在元数据写入之前完成,即使磁盘正在使用写入缓存。在磁盘驱动程序层,当驱动器报告它具有写入缓存并且已启用时,屏障会在发送后续 IO 之前强制刷新磁盘缓存。否则,这是不需要的,因此屏障只是阻止向驱动器发出后续 IO,直到前一个 IO 完成。NCQ 只是意味着它可能必须等待多个待处理请求完成后才能发出更多请求。

相关内容