Windows 10 Pro 的磁盘写入缓存功能和有限的 RAM 使用率 - 256GB DDR4

Windows 10 Pro 的磁盘写入缓存功能和有限的 RAM 使用率 - 256GB DDR4

我有一台 Windows 10 Professional 工作站,用于模拟印模中的材料流动。我使用的 FEA 软件为每次运行的模拟创建了 50-100GB 的大型数据库文件。将这些文件复制到旋转介质进行存储似乎无法充分利用此系统在传输过程中的 RAM 量,开始时速度很快,但一两秒后就降到了两个 RAID0 7200RPM 磁盘的本机传输速度 300 MB/s(171-342 秒)。这些文件来自两个 1.2TB Intel 750 PCIe NVMe SSD 上的两个 600GB 分区的软件 RAID0,因此读取性能不是问题。该系统采用带有 EBM 的 2200VA UPS,每晚备份到我们的存储服务器,因此不必担心数据丢失。

我想知道的是:

如果我可以调整 Windows 10 的缓存设置,以两台 Intel 750 能够达到的 4GB/s(12-25 秒)速度将全部 50-100GB 文件读入 RAM,然后透明地将它们写入磁盘。我的印象是内置的 Windows 功能“磁盘缓存”能够做到这一点,但 Windows 中的某些默认缓存大小设置将缓存限制为大约 5GB(因此开始时速度会略有提升)。我不认为这个小问题来自目标驱动器上微不足道的 128MB 缓存,因为“修改后的”物理内存使用量在传输的第一秒左右确实增加了约 5GB。传输对话框消失后,可以看到这 5GB 被写入磁盘。RAM 使用量随着 RAID0 中两个 7200RPM 驱动器的速度而下降。完成后,您可以看到磁盘活动变为零,RAM 利用率恢复正常。这告诉我磁盘缓存至少正在工作,只是最多限制为 5GB。

系统使用 50-100GB 的可用 RAM 进行此次传输就可以了,因为模拟通常仅使用最多 80GB 的 RAM,并且模拟直到模拟的最后阶段才会使用那么多的 RAM。

我有一台 Dell Precision T7910 工作站,其规格如下:

2P Xeon E5-2687W v4
256GB LRDIMM ECC DDR4 2400MHz
Quadro M4000
x2 Intel 750 1.2TB PCIe NVMe, one boot, 600GB RAID0 Two Partitons
x2 WD Gold 8TB in software RAID0 on SAS 12 GB Ports (128MB Cache)
Eaton 5PX 2200 IRT 240V UPS
Windows 10 Pro 1703 - System is old enough to not have Windows 10 Pro for Workstations

我已尝试过:

Checked/Enabled: "Enable write caching on the device." - On each Disk
Checked/Enabled: "Turn off Windows write-cache buffer flushing on the device." - On each Disk
Made sure Superfetch service is running (for whatever good that does).
Moved away from built-in hardware RAID, as there is NO cache anyway.

我研究过具有类似问题的其他主题,并且遇到了另一个提到“CacheSet”工具的旧帖子:

如何增加Windows 7的磁盘缓存

这是否适用于我的用例或者我应该继续寻找?

我对 Windows 平台上磁盘缓存工作原理的理解是否正确,或者它的运行方式是否与我预期的不同?我只是在寻找写入主内存的缓存,使用最多 100GB 的 RAM,仅此而已。

感谢您的帮助!欢迎提出任何建议。

编辑: 以管理员身份运行该 cacheset.exe 软件时,报告的“峰值大小”为“663732 KB”,这似乎太小了(648MB?)。只是不确定我是否想更改此设置,否则可能会弄乱这个生产系统。我一直遇到的限制是 5GB 左右。

双重编辑: 我修改了似乎实际缓存的 GB。关键是查看“修改后的物理内存”,并在传输开始时看到约 5GB 的“上限”。仍然希望将其增加到 100GB 左右。

再次感谢你!

答案1

现在有点晚了,但您可以使用 PrimoCache(以前称为 FancyCache)程序来完成所需的操作。在备用 SSD 上(或 600GB 快速 NVMe RAID0 阵列上,尽管除非您有冗余,否则这有点冒险……)设置一个卷作为二级缓存,并通过它缓存对特定慢速卷的读取和写入。您对该卷的写入将首先通过快速卷透明地缓存。当然,如果缓存卷在写入过程中失败,则数据已损坏,但这是不可避免的牺牲。如果您对要缓存的内容有选择性,它可以非常有效,同时风险最小。使用适当大小的缓存卷(256GB 可能绰绰有余),您可以在慢速和高容量机械阵列上实现接近 SSD 的性能,用于频繁访问的块。还请记住,SSD 中的写入次数有限,尽管我还没有看到过一次失败。如果确实如此,最坏的情况是您需要更换它并重新填充缓存,并且如果在写入 HDD 卷时发生故障,您可能会丢失一些数据。您还可以使用相同的程序在 RAM 中创建一级缓存,而不是使用 SSD,后者速度更快,但会占用一些 RAM。

当然,更好的解决方案是在工作站上安装 VMWare ESX,配置虚拟机,然后您可以完全按照自己的意愿配置存储阵列,以实现最佳性能和可扩展性。在虚拟机中安装 Windows 并通过 vSphere Client 远程访问它。这样,缓存就在操作系统下面完成,尽可能靠近硬件。

答案2

对于任何标准文件复制应用程序来说,更大的缓存都无济于事。

无论 Windows 文件缓存有多大,在将所有数据写入目标之前,没有一个合理的文件复制工具会关闭复制任务的输入文件(允许您删除它们)。即使所有输入数据都已读入缓存,情况也是如此。

原因是缓存中的数据并不安全 - 它可能随时消失。缓存使用的任何 RAM,如果自读取磁盘以来没有被修改过,内存管理器都会认为是可丢弃的。也就是说,如果其他程序需要 RAM,缓存使用的 RAM 可以随时从缓存中获取并“重新利用”,即提供给其他程序。当然可以 - 毕竟,任何地方都不应该有任何数据仅有的在缓存中。(除非它在从磁盘读取后已被修改。在这种情况下,它将自动排队等待写回,这将在四秒内发生;在写回完成之前,它不能被重新利用。)

因此,使用标准复制程序时,您必须等待旋转磁盘写入数据,然后才能删除源文件 - 无论缓存中缓冲了多少数据。

请注意,复制程序(或任何其他应用程序)甚至无法查明缓存中是否有内容。没有界面可以查看缓存。即使有,信息在被检索的那一刻就会被视为“过时”,甚至在应用程序查看之前。文件缓存应该自动运行,对应用程序透明,而透明性的一部分就是对它的控制非常少。

这样想:你需要一个安全的结果的中间副本 - 功能上等同于源文件的另一个副本,位于不同的目录中,甚至可能是单独的驱动器号,然后您才能安全地删除原始文件。Windows 文件缓存将绝不给您这个。即使 Windows 决定将原始文件全部放入文件缓存中(这种情况不太可能发生),文件缓存也不会给您这个。

(你可能会想“那它到底有什么用?”文件缓存的主要目的是重复访问众多小的文件(和文件系统元数据)的速度更快。而且它做得非常好。

超级获取

TL,DR 版本:SuperFetch 也不会给你这个。

您对 SuperFetch 的怀疑是正确的。虽然 SuperFetch 在其尝试执行的操作上很有效,但它对这种情况没有帮助。SuperFetch 所做的是跟踪经常访问的文件(例如每次启动时),并在需要之前尝试将它们读入 RAM。

如果你想了解 Windows 缓存的总体情况,这一区别很重要。Windows 文件缓存(我在上一节中描述过)是反应性,这意味着它永远不会缓存任何内容,直到程序实际尝试读取它为止。它自首次发布(NT 3.1)以来就一直属于 Windows NT 家族。

SuperFetch 是一个单独的机制,最初是在 Vista 中添加的。积极主动的,尝试预取过去经常访问的内容。

SuperFetch 独立于 Windows 文件缓存管理其 RAM。SuperFetch 使用 Windows 待机页面列表中的“低优先级”页面 - 有趣的是,它只是将它们留在该列表中,因此它们仍然是“可用”RAM 的一部分。(因此,在所有其他条件相同的情况下,您不会注意到启用或不启用 SuperFetch 时“可用”RAM 的差异,但您会注意到报告的“缓存”量有差异。)分配给文件缓存的 RAM 处于工作集中,因此如果需要,需要更长的时间来重新利用。由于这种设计,SuperFetch 缓存比 Windows 文件缓存“可丢弃”得更快,因此它不会为您提供任何内容的安全临时副本,就像文件缓存一样。

所以呢你做?

为了解决您的问题,我会考虑使用专用硬件。也许可以买一个不太贵或不太快的 SSD,比如 120 GB,然后将数据从 SSD 阵列复制到该 SSD,然后从那里复制到硬盘。遗憾的是,这意味着您无法开始写入硬盘,直到所有数据都复制到临时文件,所以这会比您现在所做的花费更长的时间。但源数据将更快地被释放。

一个更简单的想法是获取更多的硬盘并将它们放入更大的条带集中以增加写入吞吐量。

一个专用的复制程序(了解数据结构的程序)可能会有所帮助。

顺便说一句,我希望您的 FEA 软件在创建数据集时使用映射文件访问 - 它比传统的读/写调用快得多。

相关内容