使 SATA 磁盘写入缓存安全

der*_*ert 6 linux raid cache sata data-integrity

据说(例如,请参阅此处的有关它的问题),对于启用 NCQ 的驱动器,驱动器写入缓存应该是安全的,因为它不会对操作系统说谎,即当数据未提交到盘片时. 我试图弄清楚需要哪些设置才能使这成为现实。

我正在使用diskchecker.pl来确认是否所有块都在拔下电源插头后幸存下来。服务器配置如下:

  • 4 个 ST3500514NS 在 Linux MD RAID10 中运行。英特尔 3420 芯片组。在 AHCI 模式下。
  • LVM 在 RAID10 上运行。
  • 测试的文件系统是逻辑卷上的 ext4(barrier=1,data=ordered)。我还尝试直接在逻辑卷(块设备)上进行测试;那没有帮助。
  • Debian 6.0(挤压);内核 2.6.32-5-amd64

如果我关闭写缓存 ( hdparm -W0),那么它就可以工作(性能损失巨大)。所以看起来上层是有能力的。

我试过在 libata 中启用 FUA(通过传递fua=1给模块加载,并通过 确认dmesg),这没有帮助。

关于如何进行这项工作的任何建议?

编辑:找到原因(见我的回答);关于如何至少恢复部分性能的任何建议?

der*_*ert 3

升级到内核 2.6.38-2-amd64(从 sid)可以解决该问题,但代价是巨大的性能损失(与仅关闭写入缓存非常相似)。

对此进行一些研究,似乎MD直到2.6.33-rc1(commit a2826aa92e2e14db372eda01d333267258944033)才支持I/O屏障(RAID1除外)。