我应该在 Windows 2008 VM 上禁用写缓存吗?

jwb*_*ley 4 windows-server-2008 disk-cache

我有一台 Windows Server 2008 x64 Standard 虚拟机,它运行在带有硬件 RAID 控制器 Perc 6/i 的机器上,它有一个板载电池。

尽我所能提高性能,我想我应该禁用它。不过这很危险吗?

我的理解是电池支持的写入缓存为主机操作系统提供了性能提升,当它们仍在闪存中等待写入时告诉它写入已完成。

但是,我看不出它对性能有什么不利影响,但是启用/禁用它是否有收益(即使是微不足道的)?

Ps 有机器有备用电源。

这是一个屏幕截图以供澄清:

截屏

the*_*bit 7

每当 Windows 应用程序将数据写入磁盘时,该数据首先写入主机内存。

“正常”写入请求在数据进入内存后立即返回,并创建一个队列条目,指示该数据需要刷新到持久存储。一种称为Lazy Writer 的机制可确保定期处理此队列(默认情况下,惰性写入器每秒刷新队列的 1/8)。这是您通过取消选中“在磁盘上启用写入缓存”来禁用的机制 - 每个写入请求都需要等待,直到它被存储设备确认为“写入”,然后才能返回。

对数据完整性(数据库、文件系统驱动程序)有特定要求的应用程序确实可以选择更智能的缓存方法。对于需要立即持久化的写入(NTFS 日志、数据库事务日志),可以在写入时指定FILE_FLAG_WRITE_THROUGH。在这种情况下,写入调用不会在数据实际提交到持久存储之前返回。除非您激活导致缓存管理器忽略FILE_FLAG_WRITE_THROUGH的“启用高级性能”复选框,否则立即返回调用并将其传递给惰性写入器,就像其他“正常”写入一样。

由于您有两个额外的缓存层1(第一层是运行 KVM 管理程序的主机操作系统,第二层是带有 BBWC/FBWC 的存储控制器),事情变得越来越复杂。这些层中的每一个都会为您提供类似的选择,并且由于每个写入请求都必须通过所有这些层,因此链中最薄弱的环节将对您的数据完整性有效。

大多数应用程序开发人员知道并理解缓存和通过调用写入的影响。所以真正关键的数据部分是用FILE_FLAG_WRITE_THROUGH写入的,而没有用这个标志写入的所有数据都可以被认为是安全的,可以缓存在易失性内存中。问题从FILE_FLAG_WRITE_THROUGH开始在任何层都被忽略,数据实际上在断电或软件故障的情况下丢失。这种情况通常会导致文件系统和事务日志损坏,从而导致不可预测的结果,甚至可能需要您从备份中恢复,因此显然应该避免这种情况。如果您的存储控制器的缓存是“电池后备”或“闪存后备”,则在一定程度上可以将其视为“非易失性”,因此通常认为使用其写回缓存甚至是直写也是安全的请求2

底线:“启用磁盘写入缓存”通常是安全的,除非您正在处理未使用FILE_FLAG_WRITE_THROUGH但需要每次写入都是持久性的损坏应用程序。禁用它不会对您造成太大伤害,因为大多数调用应该由存储控制器的写入缓存处理并几乎立即返回(但您可能会因此产生额外的开销,并且缓存大小将受到控制器的 DRAM 的限制)。在您重视正常运行时间或要求数据完整性的系统上,您永远不应“启用高级性能”“关闭设备上的Windows 写入缓存缓冲区刷新”

进一步阅读:

MSDN Libary - Windows 文件缓存
Smallvoid 博客 - 硬盘缓存说明


1实际上,硬盘本身甚至还有另一层缓存,但在大多数情况下,无论驱动器的缓存设置如何,直写请求都会得到满足。一些闪存驱动器是该规则的显着(读取:损坏)例外 - 对于闪存 SSD,写入通常被缓存并报告为立即写入但仅提交到易失性缓存 - 不仅是出于性能原因,也是为了合并写入并延长寿命闪存单元的时间。闪存 SSD 的“企业”版本通常具有电容器,以确保驱动器有足够的功率将缓存刷新到闪存单元,“消费者”版本通常没有——当心这些。

2显然在所有情况下都不安全 - 如果电池有缺陷并且未被检测到,如果控制器处理断电情况的逻辑存在错误,如果断电时间超过电池能够提供电力的时间, 如果 FBWC 的超级电容或闪存单元损坏,数据将会丢失。但这些事件通常很少见,足以冒险。


Bre*_*bst 1

一般来说,这都是正确的。本质上,要写入的数据存储在物理磁盘附近的内存中,无论是磁盘控制器、RAID 控制器还是存储设备控制器。哎呀,它甚至可以在写入实际物理磁盘之前位于缓存卡上。

默认值通常是可接受的解决方案,因为除非服务器是数据库服务器或其他高磁盘流量服务,否则电源故障不太可能影响太多。

通常有两件事需要考虑:

  1. 您的磁盘/控制器供应商有什么建议?
  2. 如果您信任服务器的电源,第一个复选框是好的。如果您完全信任磁盘的电源,第二个复选框就可以了。

我只在带有专用 SAN 控制器的 iSCSI 设置中使用过第二个复选框,该控制器有两个板载控制器以及一直到断路器的冗余电源。我们在 SAN 上写入数据库和虚拟机数据,因此任何断电都不是一件好事。