jul*_*njm 13 storage filesystems disk-cache
我最近一直在阅读有关 SATA 驱动器的写入缓存、NCQ、固件错误、障碍等内容,但我不确定在发生电源故障时使我的数据安全的最佳设置是什么。
据我了解,NCQ 允许驱动器重新排序写入以优化性能,同时让内核了解哪些请求已被物理写入。
写入缓存使驱动器更快地处理请求,因为它不会等待数据写入物理磁盘。
我不确定 NCQ 和写入缓存如何在这里混合...
文件系统,特别是日志文件系统,需要确定何时写下特定请求。此外,用户空间进程使用 fsync() 强制刷新特定文件。在文件系统确定数据已写入磁盘之前,对 fsync() 的调用不应返回。
有一个功能(FUA,强制单元访问),我只在 SAS 驱动器上看到过,它强制驱动器绕过缓存并直接写入磁盘。对于其他一切,都有写屏障,这是内核提供的一种机制,可以触发驱动器上的缓存刷新。这会强制写下所有缓存,而不仅仅是关键数据,因此如果滥用会降低整个系统的速度,例如 fsync()。
然后有固件错误的驱动器,或者故意谎报数据何时被物理写入。
话虽如此.. 有几种方法可以设置驱动器/文件系统:A) NCQ 和写入缓存禁用 B) 仅启用 NCQ C) 仅启用写入缓存 D) 启用 NCQ 和写入缓存
我假设障碍已启用..顺便说一句,如何检查它们是否实际启用?
如果断电,在主动写入磁盘时,我的猜测是选项 B(NCQ,无缓存)对于文件系统日志和数据都是安全的。可能会有性能损失。
选项 D(NCQ+缓存),如果使用屏障或 FUA,对于使用 fsync() 的文件系统日志和应用程序是安全的。对于在缓存中等待的数据来说,这将是不利的,由文件系统来检测它(校验和),至少文件系统不会(希望)处于不稳定状态。在性能方面,它应该更好。
然而,我的问题是......我错过了什么吗?还有其他变量需要考虑吗?是否有任何工具可以确认这一点,以及我的驱动器是否正常运行?
sys*_*138 11
对于直接的企业系统,还有一个以存储适配器(几乎总是 RAID 卡)形式存在的附加层,其上还有另一层缓存。如今,存储堆栈中有很多抽象,我在关于“了解您的 I/O”的博客系列中对此进行了深入详细介绍。
RAID 卡可以绕过磁盘缓存,其中一些甚至允许在 RAID BIOS 中切换此功能。这就是企业磁盘是企业的原因之一,它们的固件允许消费驱动器(尤其是“绿色”驱动器)不允许的事情。此功能直接解决您担心的情况:未提交写入的电源故障。RAID 卡缓存(应该由电池或闪存支持)将被保留,直到电源恢复并且可以重新提交这些写入。
某些企业 SSD 包括一个板载电容器,其容量足以在完全断电之前提交板载缓存。
如果您使用的是磁盘直接连接到主板的系统,则保证较少。除非磁盘本身具有提交写入缓存的能力,否则电源故障确实会造成损失。该XFS文件系统赢得了不可靠的声誉,由于它的无能生存眼前这个故障模式; 它旨在在具有工程存储生存能力的完整企业系统上运行。
然而,随着时间的流逝,XFS 已经被设计为能够经受住这种考验。其他主要的 Linux 文件系统(以及Windows 上的ntfs)已经进行了工程设计以应对这种非常失败的模式。它的工作原理是丢失的写入不会出现在 FS 日志中,并且它会知道它们没有被提交,因此将安全地检测到损坏并解决。
您确实指出了此处的一个问题:存在的磁盘固件。在这种情况下,FS 日志将根据实际情况做出错误的假设,并且在一段时间内可能无法检测到损坏。奇偶校验 RAID 和镜像 RAID 可以解决这个问题,因为应该有另一个提交的副本可以从中提取。但是单磁盘设置不会进行交叉检查,因此实际上会出错。
您可以通过使用获得更多验证(并根据您假定的工作负载模式进行测试)的企业级驱动器来规避固件风险,并设计您的存储系统以使其能够在此类不真实情况下幸存下来。
归档时间: |
|
查看次数: |
2717 次 |
最近记录: |