我是否应该禁用 Windows 2008 VM 上的写入缓存?

我是否应该禁用 Windows 2008 VM 上的写入缓存?

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

为了提高性能,我认为我应该禁用此功能。但这很危险吗?

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

但是,我看不出这会对性能造成什么损害,但启用/禁用它是否有好处(即使是微不足道的)?

Ps: 该机器有备用电源。

以下是一个屏幕截图,以便澄清:

截屏

答案1

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

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

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

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

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

底线:一般来说,“启用磁盘写入缓存”除非你正在处理没有使用文件标志_写入_通过但需要每次写入都是持久的。禁用此功能不会对你造成太大影响,因为大多数调用应该由存储控制器的写入缓存处理并几乎立即返回(但你可能会因此产生额外的开销,并且缓存大小会受到控制器的 DRAM 的限制)。你绝不应该“启用高级性能”或者“关闭设备上的 Windows 写入缓存缓冲区刷新”在您重视正常运行时间或需要数据完整性的系统上。

进一步阅读:

MSDN 库 - Windows 文件缓存
Smallvoid 博客-硬盘缓存的描述


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

2显然,它并非在所有情况下都是安全的 - 如果电池有缺陷且未被检测到,如果控制器处理电源故障情况的逻辑存在错误,如果断电时间超过电池能够供电的时间,如果 FBWC 的超级电容器或闪存单元损坏,数据就会丢失。但这些情况通常很少见,值得冒这个险。

答案2

您可以安全地禁用缓冲区刷新(提前写缓存) - 即写回缓存..当且仅当您有三件事时:

  1. 计算机/服务器本身有 UPS 备份。这可以防止突然断电导致数据未写入或部分写入。当然,如果在写入数据时断电,这种情况可能会在没有写入缓存的情况下发生……但这种情况很少见。UPS 可让计算机保持正常运行

    但是,这并不能保护你免受硬锁、无法将缓存完全转储到磁盘的 BSOD(只有大约 50% 的 BSOD 可以转储缓存)、突然重启(操作系统或硬件出现问题,系统立即重启)的影响。最后是立即关机...这种情况很少见,但通常是由于 CPU 或 CPU 或芯片组过热引起的,BIOS 将关闭电源以防止损坏

  2. 如果硬盘本身有自己的电源备份,您可以帮助解决此问题。Windows 中的任何缓存数据都将丢失,但驱动器本身的缓存将被写入。

    使用 Windows Vista、7、8.x 等现代版本,您可以选择只读、写通、写回(高级)。如果您有 RAID 控制器,您可以控制控制器和 HD 本身的缓存,通常为关闭、只读、写回、写通... 但是,除非 Windows 启用了相同的设置,否则控制器/HD 写回缓存将不会启用。

  3. 备份您的计算机。只要您每周或每月进行一次夜间增量完整备份,然后每 4 小时进行一次特殊的快速增量备份,备份关键数据(此备份运行时间不应超过 10 分钟,以免影响性能)。如果您执行 1、2 和 3,我会说启用写回功能.... 尤其是在家用电脑上...

    对于企业而言...我会坚持使用直写...它几乎不会带来写回的好处(写回可将写入速度提高 5 倍,因为它不仅会告诉操作系统/程序数据已被写入。缓存会以最优化/最快速的方式将数据写入磁盘,以防止读/写磁头抖动等)。因此,写回可以完成惊人的快速任务...但对于企业而言,最好的选择是 RAID 阵列...简单或复杂(嵌套)

你可以使用 RAID 0 来实现绝对速度,但是如果出现问题,你需要停机并且必须从备份中恢复……你可以使用 RAID 5……即使 1 个驱动器彻底失败,一切都会继续正常运行(但速度会变慢),直到你更换驱动器(大多数服务器都很热)交换-able.. 和许多家庭突袭系统一样,让您拥有一个备用驱动器 - 如果您选择该选项,可以在发生故障时立即添加)

Raid 5 的读取速度非常快,但是写入时性能会受到影响,因为它必须写入 CRC 位(条带)...

其他选项是嵌套突袭..

例如,您可以取 3 个驱动器并将其设为 RAID 0...然后再取 2 组 3 个驱动器并将其设为 RAID 0...然后取 3 个 RAID 0 卷并将其合并为 1 个 RAID 5 卷。这将允许一个 RAID 0 阵列发生故障,但一切仍可继续工作。您可以让一个 r0 阵列中的所有 3 个驱动器都发生故障,您不会有任何问题...但是,如果阵列 A 中的 1 个驱动器同时发生故障,阵列 B 中的驱动器也会发生故障...那么一切都会消失...并且会从备份时间恢复...

您还可以将镜像和 raid 0 结合起来,例如,您可以对 2-6 个驱动器进行 raid 0...然后制作另一个 raid 0 驱动器来匹配...然后镜像它们。这仍然会为镜像带来少量写入命中,但镜像实际上加快了读取速度,因为它从驱动器/阵列 A 抓取一个块,并同时从驱动器/阵列 B 抓取下一个块。


我对 ANYTIME @ HOME 的最佳建议是:

镜像您的 C: (Windows 驱动器).. 假设 Windows 在 C 上... 即使它是 SSD.. 镜像它!这不会帮助损坏.. 备份就是为此而生.. 但它将为您节省大量因硬件故障而导致的停机时间

然后给自己做一个 D 盘...让它成为你巨大、快速的强力阵列...然后按照你想要的方式去做...我的 D: 盘是一个由五个 4TB HD 组成的 Raid 0 阵列...是的,如果任何一个发生故障...所有数据都会丢失...但我每个月完整备份一次,每天增量备份一次,每 4 小时特别备份一次到一个 usb 3.0 raid 盒,该盒可容纳多达 6 个 4TB 驱动器(这就是我所拥有的,它是 RAID 5)..我不建议 D 是 SSD!混合 HDDSD 还可以..但 1) 你找不到 4TB SSD..如果你找到了,它们要花一大笔钱。使用 RAIDING @ SATA 3 级别 MINIMAL..你可以获得比 SSD 更快的 HDD。

然后给自己弄一个 E: 盘... 把它做成一个非常小的 SSD... 不超过 100-200GB.. 或者你能找到的最小的那个


现在为什么所有这些驱动器号...我来解释一下:

C: 是镜像,写入速度慢,读取速度快...仅适用于 WINDOWS...不要在此驱动器上安装任何东西,除非程序需要它。即使你将程序、游戏安装到 D 盘,它也会经常将东西放在 C 盘上,即使你不想这样。关键是你不希望 C: 因加载窗口而超载,然后加载所有服务,再加上预加载程序所需的所有内容,再加上从 C:/ 预先缓存所有内容,你很容易就会得到一个系统,让你等待 5-20 分钟才能停止抖动,然后才能使用它。C: 应该是一个 300GB 大小的 SSD。这将有助于加快启动速度。将所有东西都安装在 D: 上后,Windows 启动时,程序需要加载的东西将来自 D: 而不是 C:,并承担 C: 的负载...此外,超级读取将在登录屏幕出现后约 15 秒启动。即使它是 SSd,您也不想让所有东西都破坏 C...您只希望它加载 Windows 的东西,让它破坏 D,因为 D: 应该至少有 3 个或更多驱动器处于 RAID 0 或 5 配置中。这样,您就可以立即登录 Windows,Windows 将很快启动

如果你有大量的 RAM(16-32GB)并且你largediskcache在注册表中启用了,Windows 很容易就需要一个小时来预先缓存东西,但是如果你开始使用 PC,它将把这个优先级放在后台

D:驱动器...把所有东西都放在这里..这是你的主要存储库..让 Windows 将文档、图片、音乐、联系人等文件夹重新定位到 D:上的文件夹中,将所有内容放在 D:上,你的程序将快速加载并快速读写

E:基本上只用于页面文件。但您也可以对其进行配置,如果您使用的是 Windows 8,则可以将驱动器用于文件历史记录备份……这样,您就可以定期备份和 Windows 文件历史记录,可以立即恢复损坏、意外删除的文件等

交换文件...您希望每个驱动器上都有一个交换文件...为什么?Windows 使用多个交换驱动器,类似于 RAID 阵列。它将使用它们并行读取/写入,并且如果驱动器繁忙,它将排除该驱动器的分页活动,直到使用率下降。

对于 C: 驱动器,我仅建议使用最小值。这取决于 RAM(我假设是 64 位操作系统,因为现在每个人都应该使用 64 位 Windows).... 对于 8GB 系统,最小值为 400MB,16GB=800MB,32G=1.6GB。这样做的原因是,在发生 BSOD 时,需要最小大小才能进行小型/迷你转储,并允许 Windows 编写一个文件来帮助解释出了什么问题。您可以选择在 C: 上完全不使用页面文件,以提高系统驱动器的性能。只要您不关心 BSOD 报告,这完全没问题 - 特别是如果您从不或很少出现 BSOD

D: 是一个大驱动器,速度很快。即使您在使用它,它也可以处理分页活动。但是,一旦驱动器活动达到 100%,它将缩减使用分页文件的数量……但这个分页文件应该更像是 8GB

E:设为 8GB

这将为您提供 16GB 的页面文件空间,并且它可以并行使用 D&E。如果 D 很忙,那么它将只使用 E:,并且 E:会很快,因为它是 SSD……即使 E 是 HDD 或 HDDSD,我仍然推荐这种设置。

最后要考虑的一件事是,由于您的大多数活动都将使用 D:,因此您可以将一个大小合适的页面文件放在 C: 上,因为如果您在 D: 上使用 INTENSE 程序,这不会减慢您的速度

不管你拥有 4.8.12.16.32.64GB 的内存,8,8,8 都有点过大了。对于 12 或 15GB 的页面文件,我会选择 4,4,4 或 5.5.5。


许多人会说如果你有 16+ GB 的 RAM 就不要使用页面文件——错了!

您可以这样设置窗口,但它会忽略您并在您不知情的情况下在所有硬盘上设置临时页面文件。许多程序都是硬编码的,以将空闲代码交换到页面文件……没有页面文件会破坏此代码。Windows 旨在将空闲代码放入分页系统,为硬盘缓存留出更多空间。因此,实际上没有办法通过关闭分页文件来强制所有代码进入内存。

通过实际使用页面文件...你正在加速你的系统

另一个选项是 READY boost.. 很多人反对它.. 但我是它的坚定支持者... 它只能在 HDD 或 HDDSD 上运行... 它不能在 SSD 驱动器上运行... 没有意义,因为 SSD 比拇指驱动器快得多....

但是,32-64 GB 的优质 USB 3.0 THumb 驱动器可以以 150-200MBytes/秒的速度读取/写入....通常需要在 raid 0 中使用许多 SATA 3 HDDSD 才能达到这个速度级别。

我使用它...它只用于我的 D 盘..它是 64GB,你必须将它格式化为 NTFS,否则,它只能使用 4GB..而 64GB 是 RB 盘的最大容量...一旦我激活它,我的系统需要花费 2-3 小时来加载它...在较慢的设备中,Windows 只会加载小文件,读取速度快...在快速 RB 盘中,Windows 8.x 会将整个文件存储在那里..如 1、2、3、5 等 GB 文件。我的 raid 阵列可以以 175MB/s 的速度读取,以 150MB/s 的速度写入..我的 RB 盘是 200/200...所以 Windows 会用 64GB 的数据加载它。

我有 32 GB 的 RAM..所以 Windows 会将最需要的文件放在 RAM 缓存中...然后将优先级不是那么高的文件(或者某些文件不断被踢出 RAM 缓存).....在这种情况下,Windows 可能会将高优先级文件放在两个位置。

人们说 RB 在我的系统上是一种浪费……错了……当我在不使用 RB 驱动器的情况下更改 Dragon Age Inqusition 中的区域时,需要大约 60 秒才能加载新区域(当数据未缓存到 RAM 时)……但如果它已经在 RB 驱动器上,但不在 RAM 中,它会在 30 秒内加载。与以前版本的 Windows 不同,Windows 8.x 使 RB 驱动器上的数据持久存在,并且您的缓存将在关机、重启、休眠和睡眠后仍然存在。但是,如果 Windows 认为它​​因某种原因被删除,它会擦除​​它并重新开始……

答案3

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

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

通常有两件事需要考虑:

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

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

答案4

为了更清楚地说明,缓存可以有几个级别,从上到下:

  • 软件缓存:由操作系统处理,无论操作系统看到的磁盘是物理磁盘还是 RAID 控制器提供的 RAID LUN。这使用 PC 内存,并且永远不会由电池供电。即使软件崩溃,它也会丢失。
  • RAID 缓存:这是唯一可以使用电池供电的缓存。它在服务器 RAID 控制器上很常见,无论是 BBWC = 电池供电的写入缓存,还是任何变体,如 HP 的 FBWC。请注意,并非所有 RAID 控制器都具有此功能
  • 磁盘写入缓存:大多数磁盘都提供该缓存。不是电池缓存。如果磁盘断电,数据就会丢失。

缓存始终是易失性存储器,通常是 RAM,比磁盘快得多。使用它进行写入的问题是,如果系统因任何原因(从断电到硬件故障,甚至软件崩溃)关闭,在操作系统缓存的情况下,缓存中的数据将丢失。丢失数据总是很严重的。最好的情况是损坏您正在处理的文档。但可能是悲剧性的:例如损坏任何重要的操作系统文件、数据库文件或磁盘分区表信息。考虑到问题通常很严重,因为您通常不会“丢失最后的更改”,而是得到一个损坏的文件。

问题中的快照看起来像是操作系统(Windows)缓存/可移动磁盘的磁盘缓存的配置。因此,除非您不介意这种麻烦,否则您应该禁用它。例如,如果您正在写入某种顺序流,如视频数据,您只会丢失最后一部分,这是可以接受的。在大多数情况下,情况并非如此。

BBWC 始终在 RAID 配置实用程序中设置。例如,在 HP SSA 或 ACU 中,您可以:

  • 启用磁盘的写入缓存。如果这样做,您会收到警告。
  • 设置 RAID 控制器内存(通常为 1、2 或 4GB)的百分比用于读取和写入。如果您的 RAID 控制器是 BB,则可以安全地将其用于写入缓存。如果不是,您会收到警告。
  • 如果电池电量不足或电池丢失或有故障,请禁用写入缓存。这将由控制器自动处理,如果您禁用它,实用程序将显示警告。

请记住,如果您使用的是 RAID 控制器,则物理磁盘配置(包括磁盘写入缓存)由控制器处理。操作系统对物理磁盘一无所知,因为它只看到逻辑驱动器 (LUN),无法控制或了解其背后的内容。在这种情况下,如果提供任何类型的缓存,都是操作系统缓存。并且没有电池支持。

注意:BBWC 的工作方式如下:

  • 您的系统因任何原因关闭:崩溃、损坏、电源故障……
  • 电池维持高速缓存的活力
  • 问题解决后服务器重新启动
  • 控制器将缓存的数据写入磁盘

这甚至允许在发生硬件故障时恢复数据,但您需要在电池耗尽之前解决问题,通常最多需要 2 或 3 天。

有趣的是惠普FBWC,它可以快速将缓存的数据从易失性 RAM 移动到非易失性内存,这样即使电池耗尽也不会有问题。在这种情况下,无论解决问题需要多长时间,数据都不会丢失。理论上,您甚至可以将磁盘和控制器移动到不同的服务器,并确保数据安全。

相关内容