原始 KB 数: 4016173
总结
弹性文件系统(ReFS)由于其写入时分配的元数据语义和块缓存逻辑,可能会消耗大量内存。 此行为可能导致内存压力降低服务器性能。
本文介绍此问题的原因,并介绍如何应用累积更新并配置注册表项以减少 ReFS 内存使用量。
现象
你注意到使用弹性文件系统(ReFS)的计算机上的内存使用率较高。
原因
为了提高其元数据的弹性,ReFS 对所有元数据更新都使用 写时分配 语义。 此方法意味着 ReFS 永远不会对元数据进行就地更新。 而是将所有写入操作都定向到新分配的区域。
但是,使用写入时分配会导致 ReFS 相比就地写入文件系统,向卷的新区域发出更多的元数据 I/O 请求。 此外,ReFS 使用块缓存逻辑在 RAM 中缓存其元数据。 它不像文件缓存逻辑那样资源高效。
由于 ReFS 块缓存逻辑和写入时分配语义,ReFS 使用大型元数据流。 ReFS 使用缓存管理器创建元数据流,而缓存管理器会以惰性方式解除对非活动视图的映射。 在某些情况下,这种延迟取消映射会导致服务器上的活动工作集大小增大。 这种增长会产生内存压力,进而会导致性能不佳。
解决方法
2017 年 3 月 14 日发布的累积更新(CU)4013429引入了三个可用于调整大型 ReFS 元数据流的可调整注册表项。
如何设置可调整的注册表项
重要
本部分、方法或任务包含说明如何修改注册表的步骤。 如果您错误地修改注册表,可能会出现严重问题。 因此,请确保仔细执行这些步骤。 出于防范目的,请在修改之前备份注册表,以便在出现问题时还原注册表。 有关如何备份和恢复注册表的更多信息,请参见如何在 Windows 中备份和恢复注册表。
可以使用注册表编辑器或命令行命令(例如 reg add)设置注册表项。 这些参数的范围不会重叠,因此可以在任意组合中使用它们。 注册表项都位于 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 子项下。
| 值名称 | 类型 | 默认值 | 影响 |
|---|---|---|---|
RefsEnableLargeWorkingSetTrim |
REG_DWORD | 当该值设置为 1 时,ReFS 会尝试在每个检查点对所有元数据流完成 MM 取消映射操作。 | |
RefsNumberOfChunksToTrim |
REG_DWORD | 4 | 影响 ReFS 在遍历整个命名空间时取消映射的粒度。 将 RefsNumberOfChunksToTrim 设置为更高的值会导致 ReFS 更激进地执行修整。 它减少了正在使用的内存量。 |
RefsEnableInlineTrim |
REG_DWORD |
重要
- 更改这些参数后,必须重新启动计算机。
- 在故障转移群集上,必须在每个群集节点上以相同的方式设置这些参数。
如果由于大型活动工作集而出现性能不佳,请执行以下步骤来优化 ReFS 行为:
-
确认该卷处于空闲状态,且没有任何已映射的页面。 然后,设置为
RefsEnableLargeWorkingSetTrim``1并监视系统以查看性能是否提高。 -
如果性能不够提高,请验证未映射的 VA 范围是否没有任何活动引用(即映射的元数据页)。
-
更改
RefsNumberOfChunksToTrim的值。 尝试不同的值,例如8,16``32等等。注意
以下公式确定 ReFS 对虚拟地址空间取消映射时所采用的粒度:
RefsNumberOfChunksToTrim* 128 MB(对于大小 > 为 10 TB 的卷)RefsNumberOfChunksToTrim* 64 MB(对于大小 < 为 10 TB 的卷)
-
如果性能仍无法改进,请设置为
RefsEnableInlineTrim``1。
详细信息
为了提高其抵御损坏的能力,ReFS 使用写时分配而不是原地写入来更新其元数据。 电源故障或意外卸载可能会在使用就地写入的系统中导致“撕裂写入”(即仅部分完成的写入)。 但是,在相同情况下,采用写时分配的系统仍然可以引用先前一致的元数据副本。 通过这种方式,ReFS 可靠地维护元数据一致性。