镜像加速奇偶校验

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016

存储空间可以使用两种基本技术为数据提供容错:镜像和奇偶校验。 在存储空间直通中,ReFS 引入了镜像加速奇偶校验,允许创建同时使用镜像和奇偶校验弹性的卷。 镜像加速奇偶校验在不牺牲性能的情况下提供了低廉、高空间效率的存储。

Diagram depicting the mirror accelerated parity volume.

背景

镜像和奇偶校验复原方案具有完全不同的存储和性能特征:

  • 镜像复原使用户可以获得快速写入性能,但是复制每个副本的数据并不能节省空间。
  • 另一方面,奇偶校验必须为每次写入重新计算奇偶校验,这会影响随机写入性能。 然而,奇偶校验确实允许用户以更高的空间效率存储数据。 有关详细信息,请参阅存储空间容错

因此,镜像倾向于提供性能敏感的存储,而奇偶校验则提供改进的存储容量利用率。 在镜像加速奇偶校验中,ReFS 利用每种复原类型的优势,通过在单个卷中组合两种复原方案,提供容量高效和性能敏感的存储。

镜像加速奇偶校验的数据旋转

ReFS 在镜像和奇偶校验之间实时主动旋转数据。 这允许将传入的写入快速写入镜像,然后旋转到奇偶校验,以便高效存储。 这样一来,传入 IO 可以在镜像中快速得到服务,而原始数据则可以高效地存储在奇偶校验中,从而在同一卷中提供最佳性能和成本损失存储。

为了在镜像和奇偶校验之间旋转数据,ReFS 以逻辑方式将卷划分为 64MiB 的区域,它们是旋转的单位。 下图描绘了已划分为多个区域的镜像加速奇偶校验卷。

Diagram depicting mirror accelerated parity volume with storage containers.

镜像层达到指定的容量级别,ReFS 就开始将整个区域从镜像旋转到奇偶校验。 ReFS 不是立即将数据从镜像移动到奇偶校验,而是等待并尽可能长时间地将数据保留在镜像中,从而使 ReFS 能够持续为数据提供最佳性能(请参阅下面的“IO 性能”)。

当数据从镜像移动到奇偶校验时,会读取数据、计算奇偶校验编码,然后将该数据写入奇偶校验。 下面的动画使用三向镜像区域对此进行了说明,该区域在旋转过程中转换为擦除编码区域:

Animation showing mirror accelerated parity rotation.

镜像加速奇偶校验的 IO

IO 行为

写入:ReFS 以三种不同的方式为传入写入提供服务:

  1. 写入镜像:

    • 1a. 如果传入写入修改了镜像中的现有数据,ReFS 将就地修改数据。
    • 1b. 如果传入写入是新的写入,并且 ReFS 能够成功地在镜像中找到足够的可用空间来为此写入提供服务,则 ReFS 将写入镜像。 Screenshot showing how the ReFS service writes to mirror.
  2. 写入镜像,从奇偶校验重新分配:

    如果传入写入修改奇偶校验中的数据,并且 ReFS 可以在镜像中成功找到足够多的可用空间,以供传入写入使用,则 ReFS 将首先使奇偶校验中的以前数据失效,然后再写入镜像。 此无效是快速而低廉的元数据操作,有助于显著提高奇偶校验的写入性能。 Screenshot showing how the ReFS service writes to mirror, reallocated from parity.

  3. 写入奇偶校验:

    如果 ReFS 无法在镜像中成功找到足够的可用空间,ReFS 将向奇偶校验写入新数据或直接修改奇偶校验中的现有数据。 下面的“性能优化”部分提供了指南,有助于最小化奇偶校验的写入。 Screenshot showing how the ReFS service writes to parity.

读取:ReFS 将直接从包含相关数据的层中读取。 如果奇偶校验是用 HDD 构建的,存储空间直通中的缓存将缓存此数据,以加速未来读取。

注意

读取永远不会导致 ReFS 将数据旋转回镜像层。

IO 性能

写入:上方描述的每种类型的写入都有自己的性能特征。 大体来说,写入镜像层比重新分配的写入快得多,而重新分配的写入比直接写入奇偶校验层也要快得多。 下面的不等式说明了这种关系:

  • 镜像层 > 重新分配的写入 >> 奇偶校验层

读取:从奇偶校验读取时不会对性能产生实际负面影响:

  • 如果镜像和奇偶校验是用相同媒体类型构建的,则读取性能将相当。
  • 如果镜像和奇偶校验是用不同媒体类型构建的—镜像 SSD、奇偶校验 HDD—存储空间直通中的缓存将有助于缓存热数据,以加快从奇偶校验读取的速度。

ReFS 压缩

Windows Server 2019 及更高版本中提供了适用于 ReFS 的压缩功能,这大大提高了超过 90% 空间已满的镜像加速奇偶校验卷的性能。

背景:以前,当镜像加速奇偶校验卷已满时,这些卷的性能可能会降低。 由于整个卷中的热数据和原始数据会随着时间的推移而混合,因此性能会下降。 这表示可以存储在镜像中的热数据会减少,因为原始数据占用了镜像中可由被热数据使用的空间。 将热数据存储在镜像中对于保持高性能至关重要,因为直接写入镜像比重新分配的写入快得多,且比直接写入奇偶校验快几个数量级。 因此,镜像中有原始数据对性能不利,因为它降低了 ReFS 直接写入镜像的可能性。

ReFS 压缩通过为热数据释放镜像空间来解决这些性能问题。 压缩首先将镜像和奇偶校验中的所有数据合并为奇偶校验。 这减少了卷内的碎片,并增加了镜像中的可寻址空间量。 更重要的是,此过程使 ReFS 能够将热数据合并回镜像:

  • 当新写入传入时,将在镜像中提供这些写入。 因此,新写入的热数据驻留在镜像中。
  • 当对奇偶校验中的数据进行修改写入时,ReFS 进行重新分配的写入,因此还将在镜像中提供此写入。 因此,在压缩过程中移动到奇偶校验的热数据将重新分配回镜像。

性能优化

重要

建议将写入密集型 VHD 放置在不同的子目录中。 这是因为 ReFS 在目录及其文件级别写入元数据更改。 因此,如果你将写入密集型文件分布到各个目录中,元数据操作会更小,并且会并行运行,从而降低了应用的延迟。

性能计数器

ReFS 维护性能计数器,以帮助评估镜像加速奇偶校验的性能。

  • 如上面的“写入奇偶校验”部分所述,ReFS 将在镜像中找不到可用空间时直接写入奇偶校验。 通常,当镜像层的填充速度快于 ReFS 将数据旋转为奇偶校验时,就会发生这种情况。 换句话说,ReFS 的旋转无法跟上引入速率。 以下性能计数器标识 ReFS 直接写入奇偶校验的时间:

    # Windows Server 2016
    ReFS\Data allocations slow tier/sec
    ReFS\Metadata allocations slow tier/sec
    
    # Windows Server 2019
    ReFS\Allocation of Data Clusters on Slow Tier/sec
    ReFS\Allocation of Metadata Clusters on Slow Tier/sec
    
  • 如果这些计数器为非零,则表示 ReFS 将数据旋转出镜像的速度不够快。 为了帮助缓解这种情况,可以改变旋转主动性或增加镜像层的大小。

旋转主动性

镜像达到指定容量阈值后,ReFS 就开始旋转数据。

  • 此旋转阈值的值越高,ReFS 在镜像层中保留数据的时间就越长。 将热数据留在镜像层对性能来说是最佳的,但 ReFS 将无法有效地提供大量传入 IO。
  • 较低的值使 ReFS 能够主动取消暂存数据并更好地引入 IO。 这适用于引入繁重的工作负载,例如存档存储。 但是,较低的值可能会降低常规用途工作负载的性能。 在不必要的情况下,将数据旋出镜像层会对性能产生负面影响。

ReFS 引入了可调参数以调整此阈值,其可使用注册表项进行配置。 必须在存储空间直通部署中的每个节点上配置此注册表项,并且需要重新启动才能使任何更改生效。

  • 注册表项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Policies
  • ValueName (DWORD): DataDestageSsdFillRatioThreshold
  • ValueType: 百分比

如果未设置此注册表项,ReFS 将使用默认值 85%。 对于大多数部署,建议使用此默认值,且不建议使用低于 50% 的值。 下面的 PowerShell 命令演示如何使用值 75% 设置此注册表项:

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Policies -Name DataDestageSsdFillRatioThreshold -Value 75

要在存储空间直通部署中的每个节点上配置此注册表项,可以使用以下 PowerShell 命令:

$Nodes = 'S2D-01', 'S2D-02', 'S2D-03', 'S2D-04'
Invoke-Command $Nodes {Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Policies -Name DataDestageSsdFillRatioThreshold -Value 75}

增加镜像层的大小

增加镜像层的大小可使 ReFS 在镜像中保留工作集的较大部分。 这提高了 ReFS 可以直接写入镜像的可能性,这将有助于实现更好的性能。 以下 PowerShell cmdlet 演示如何增加镜像层的大小:

Resize-StorageTier -FriendlyName "Performance" -Size 20GB
Resize-StorageTier -InputObject (Get-StorageTier -FriendlyName "Performance") -Size 20GB

提示

请确保在重设 StorageTier 的大小后重设分区的大小。 有关详细信息和示例,请参阅扩展卷

创建镜像加速奇偶校验卷

下面的 PowerShell cmdlet 可创建镜像:奇偶校验比为 20:80 的镜像加速奇偶校验卷,这是推荐用于大多数工作负载的配置。 有关更多信息和示例,请参阅在存储空间直通中创建卷

New-Volume -FriendlyName "TestVolume" -FileSystem CSVFS_ReFS -StoragePoolFriendlyName "StoragePoolName" -StorageTierFriendlyNames Performance, Capacity -StorageTierSizes 200GB, 800GB

其他参考