确保 SATA 磁盘写入缓存的安全

确保 SATA 磁盘写入缓存的安全

据称(参见,例如,这里有关于它的问题),对于启用了 NCQ 的驱动器,驱动器写入缓存应该是安全的,因为它不会向操作系统谎报数据是否已提交到盘片(实际上并没有)。我正在尝试弄清楚需要哪些设置才能实现这一点。

我在用着磁盘检查器确认是否所有块在拔掉电源插头后仍能存活。服务器配置如下:

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

如果我关闭写入缓存(hdparm -W0),它就可以工作(但性能会大幅下降)。所以看起来上层是有能力的。

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

关于如何实现这个功能有什么建议吗?

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

答案1

升级到内核 2.6.38-2-amd64(从 sid 开始)可以修复该问题,但代价是性能大幅下降(与关闭写缓存非常相似)。

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

答案2

是的,据我所知这是安全的代价,您可以在 Postgresql 邮件列表中的每个文件系统和存储层中看到许多关于数据安全和速度成本的帖子,例如,他们最近一直在谈论 SSD 安全性,只有 Vertex 2 Pro 或最新的英特尔 SSD 系列带有小内存(如 raid 控制器中的电池缓存)才能安全地用于数据库,并且 SSD 的问题无法通过禁用写缓存来修复。

我在这里粘贴了两个链接,但您的邮件列表中有多个示例,请进行搜索。

http://archives.postgresql.org/pgsql-performance/2010-06/msg00076.php

http://archives.postgresql.org/pgsql-general/2011-04/msg00709.php

答案3

这就是为什么您确实应该使用带有 BBU(电池备份单元)的硬件 RAID 控制器。这样您既可以打开写入缓存,又可以保证安全。

相关内容