了解存储池缓存

适用于:Azure Stack HCI 版本 22H2 和 21H2;Windows Server 2022、Windows Server 2019

重要

Azure Stack HCI 现在是 Azure 本地的一部分。 产品文档重命名正在进行中。 但是,旧版 Azure Stack HCI(例如 22H2)将继续引用 Azure Stack HCI,不会反映名称更改。 了解详细信息

存储空间直通是 Azure Stack HCI 和 Windows Server 背后的基础存储虚拟化技术,具有内置的服务器端缓存,可在降低成本的同时最大化存储性能。 这是一个大型、持久的实时读取和写入缓存,在部署时会自动进行配置。 在大多数情况下,无需进行任何手动管理。 缓存的工作原理取决于现有的驱动器类型。

驱动器类型和部署选项

存储空间直通目前适用于四种类型的驱动器:

驱动器类型 说明
PMem PMem 是指永久性内存,一种新的低延迟、高性能存储类型。
NVMe NVMe(非易失性快速内存)是指直接位于 PCIe 总线上的固态硬盘。 常见外形规格为 2.5 英寸 U.2、PCIe 附加卡 (AIC) 和 M.2。 NVMe 提供较高的 IOPS 和 I/O 吞吐量,延迟也比目前支持任何其他驱动器类型低(PMem 除外)。
SSD SSD 是指通过传统 SATA 或 SAS 连接的固态硬盘。
HDD HDD 是指旋转式的磁性硬盘,以较低的成本提供巨量存储容量。

这些类型可按各种方式进行组合,我们将其划分成两大类别:“全闪存”和“混合”。 不支持所有 HDD 的部署。

注意

本文介绍了 NVMe、SSD 和 HDD 的缓存配置。 有关使用永久性内存作为缓存的信息,请参阅了解和部署永久性内存

全闪存部署的可行性

全闪存部署旨在最大化存储性能,不包括 HDD。

该图显示了全闪存部署,包括将 NVMe 用于容量,将 NVMe 用于缓存且将 SSD 用于容量,以及将 SSD 用于容量。

混合部署的可行性

混合部署旨在均衡性能和容量或者最大化容量,包括 HDD。

该图显示了混合部署,包括将 NVMe 用于缓存且将 HDD 用于容量,将 SSD 用于缓存且将 HDD 用于容量,以及将 NVMe 用于缓存且将 HDD 和 SSD 用于容量。

注意

单服务器配置不支持混合部署。 全平面单一存储类型配置(例如全 NVMe 或全 SSD)是单一服务器唯一支持的存储类型。

自动选择缓存驱动器

在使用多种类型的驱动器的部署中,存储空间直通自动将“速度最快”的所有驱动器类型用于缓存。 剩余的驱动器用于提供容量。

可根据以下层次结构来确定“最快”的类型。

该图显示了按速度(从快到慢)排列的磁盘类型,其顺序为:NVMe、SSD、无标记磁盘(表示 HDD)。

例如,如果你有 NVMe 和 SSD,则 NVMe 将为 SSD 提供缓存。

如果你有 SSD 和 HDD,则 SSD 将为 HDD 提供缓存。

注意

缓存驱动器不会为群集贡献可用的存储容量。 存储在缓存中的所有数据也会存储在其他位置,或者在解除暂存后存储在其他位置。 这意味着,群集的原始总存储容量只是容量驱动器的总和。

如果所有驱动器属于同一类型,则不会自动配置缓存。 可以选择手动将持久性较高的驱动器配置为针对同一类型的持久性较低的驱动器提供缓存 – 请参阅手动配置部分了解操作方法。

提示

在某些情况下,使用存储池缓存没有意义。 例如,在全部使用 NVMe 或全部使用 SSD 的部署中,尤其是在极小规模的部署中,不让任何驱动器“支出”容量用于缓存可改进存储效率并最大化性能。 同样,小型远程或分支机构部署的缓存驱动器空间可能有限。

自动设置缓存行为

根据要提供缓存的驱动器类型自动确定缓存的行为。 为 U 盘提供缓存时(例如为 SSD 提供 NVMe 缓存),只缓存写入内容。 为旋转磁盘驱动器提供缓存时(例如为 HDD 提供 SSD 缓存),将同时缓存读取和写入内容。

该图将用于“全闪存”部署的缓存(其中会缓存写入但不缓存读取)和用于“混合”部署的缓存(其中会缓存读取和写入)相比较。

全闪存部署的只写缓存

缓存可用于全闪存方案,例如,使用 NVMe 作为缓存来提高 SSD 的性能。 为全闪存部署提供缓存时,只缓存写入内容。 由于许多写入和重写可能在缓存中合并,并只在需要时才解除暂存,因此可以减小容量驱动器的磨损,减少发往容量驱动器的累积流量,并延长驱动器的寿命。 出于此原因,我们建议选择持久性较高且已经过写入优化的驱动器用于缓存。 容量驱动器可能合理地具有较低的写入持久性。

由于读取操作不会显著影响闪存的寿命,并且 SSD 一贯提供较低的读取延迟,因此不会缓存读取数据:读取数据直接从容量驱动器提供(除非数据是最近才写入的,以致尚未解除暂存)。 这样,缓存就可以专门用于写入,并将其有效性最大化。

因此,写入特征(例如写入延迟)由缓存驱动器来支配,而读取特征则是由容量驱动器来支配。 两者都是一致、可预测且统一的。

混合部署的读取/写入缓存

为 HDD 提供缓存时,会同时缓存读取和写入内容,以便为读取和写入操作提供类似于闪存的延迟(通常可将延迟缩短大约 10 倍)。 读取缓存存储最近和经常读取的数据以进行快速访问,并尽量减少发往 HDD 的随机流量。 (由于 HDD 的寻轨和旋转延迟,随机访问 HDD 时出现的滞后时间和时间损失会很明显。)写入内容将会缓存,以缓解数据突发,并与前面所述一样,写入和重写将会合并,以将发往容量驱动器的累积流量减到最小。

存储空间直通实现某种算法来反随机化写入,然后将其解除暂存,这样,即使来自工作负载(例如虚拟机)的实际 I/O 是随机的,也能模拟磁盘的 IO 模式,使其看似是有序的。 这可以将 HDD 的 IOPS 和吞吐量最大化。

在使用 NVMe、SSD 和 HDD 的部署中缓存

使用所有上述三种类型的驱动器时,NVMe 驱动器将为 SSD 和 HDD 提供缓存。 行为如上所述:对于 SSD,仅缓存写入;对于 HDD,同时缓存读取和写入。 HDD 的缓存负担均匀分散在各个缓存驱动器之间。

摘要

下表汇总了哪些驱动器用于缓存、哪些驱动器用于容量,以及每种部署可行性的缓存行为。

部署 缓存驱动器 容量驱动器 缓存行为(默认)
全使用 NVMe 无(可选:手动配置) NVMe 只写(如果已配置)
全使用 SSD 无(可选:手动配置) SSD 只写(如果已配置)
NVMe + SSD NVMe SSD 只写
NVMe + HDD NVMe HDD 读取 + 写入
SSD + HDD SSD HDD 读取 + 写入
NVMe + SSD + HDD NVMe SSD + HDD HDD 为读取 + 写入,SSD 为只写

服务器端体系结构

缓存在驱动器级别实现:一台服务器中的每个缓存驱动器绑定到同一台服务器中的一个或多个容量驱动器。

由于缓存的级别低于剩余 Windows 软件定义的存储堆栈,因此它不运用,也无需意识到“存储空间”或“容错”之类的概念。 可将它看作是创建“混合”(一部分是快闪,一部分是磁盘)驱动器,然后将其提供给操作系统。 与实际的混合驱动器一样,在外部几乎看不到物理媒体上速度较快和较慢部分之间冷热数据的实时移动。

假设存储空间直通中的复原功能至少位于服务器级别(这意味着,数据副本始终写入不同的服务器;每个服务器最多有一个副本),则缓存中的数据与不在缓存中的数据享有相同的复原能力。

该图表示通过存储空间层中的三向镜像联接的三个服务器,三向镜像会访问缓存层的 NVMe 驱动器,而这些驱动器会访问未标记的容量驱动器。

例如,在使用三向镜像时,任何数据的三个副本将写入不同的服务器,然后从服务器进入缓存。 无论以后是否解除暂存这些副本,都始终有三个副本。

驱动器绑定是动态的

缓存驱动器与容量驱动器之间的绑定可以采用任何比率,从 1:1 到 1:12 甚至更高都可以。 每当添加或移除驱动器(例如扩展时或在故障后)时,这种绑定会动态调整。 这意味着,只要有需要,都可以单独添加缓存驱动器或容量驱动器。

该动态图显示了两个 NVMe 缓存驱动器,它们以动态方式先映射到前四个容量驱动器,然后映射到六个容量驱动器,最后再映射到八个容量驱动器。

为了对称,容量驱动器的数目最好是缓存驱动器数目的倍数。 例如,如果你有 4 个缓存驱动器,则配置 8 个容量驱动器(1:2 比例)的性能比配置 7 个或 9 个容量驱动器更均衡。

处理缓存驱动器故障

当某个缓存驱动器发生故障时,任何尚未解除暂存的写入内容都不会丢进本地服务器,这意味着,它们只存在于其他副本(其他服务器)中。 就像在其他任何驱动器发生故障后一样,存储空间可以通过查阅幸存的副本来自动恢复。

有一小段时间,绑定到丢失的缓存驱动器的容量驱动器会显示为不正常。 发生缓存重新绑定(自动)并完成数据修复(自动)之后,这些驱动器将继续显示为正常。

因为会发生这种情况,每台服务器至少需要两个缓存驱动器才能保留良好的性能。

该动态图显示两个 SSD 缓存驱动器已映射到六个容量驱动器,直到一个缓存驱动器发生故障,这导致所有六个驱动器映射到剩余的缓存驱动器。

然后,可以像更换其他任何驱动器一样更换缓存驱动器。

注意

可能需要关闭电源来安全更换外形规格为附加卡 (AIC) 或 M.2 的 NVMe。

与其他缓存之间的关系

Windows 软件定义的存储堆栈中有多个其他不相关的缓存。 例如,存储空间写回缓存,以及群集共享卷 (CSV) 内存中读取缓存。

使用 Azure Stack HCI 时,不应修改存储空间写回缓存的默认行为。 例如,不应在 New-Volume cmdlet 中使用 -WriteCacheSize 之类的参数。

你可以自行决定是否使用 CSV 缓存。 默认情况下,它在 Azure Stack HCI 中处于启用状态,但它不会以任何方式与本主题中所述的缓存发生冲突。 在某些情况下,它可以提供宝贵的性能增益。 有关详细信息,请参阅将 CSV 内存中读取缓存与 Azure Stack HCI 配合使用

手动配置

大多数部署无需进行手动配置。 如果需要手动配置,请参阅以下部分。

如果需要在设置后对缓存设备型号进行更改,请根据运行状况服务概述中所述,编辑运行状况服务的支持组件文档。

指定缓存驱动器型号

在所有驱动器都属于同一类型的部署中(例如,全使用 NVMe 或全使用 SSD 的部署),由于 Windows 无法自动分辨同一类型的驱动器的特征(例如写入持久性),因此不会配置缓存。

若要使用持久性较高的驱动器为类型相同但持久性较低的驱动器提供缓存,可以使用 Enable-ClusterS2D cmdlet 的 -CacheDeviceModel 参数指定要使用的驱动器型号。 该模型的所有驱动器均将用于缓存。

提示

请确保型号字符串与 Get-PhysicalDisk 输出中显示的字符串完全一样。

示例

首先获取物理磁盘的列表:

Get-PhysicalDisk | Group Model -NoElement

下面是一些示例输出:

Count Name
----- ----
    8 FABRIKAM NVME-1710
   16 CONTOSO NVME-1520

然后输入以下命令并指定缓存设备型号:

Enable-ClusterS2D -CacheDeviceModel "FABRIKAM NVME-1710"

可以验证所需的驱动器是否正用于缓存,方法是在 PowerShell 中运行 Get-PhysicalDisk,并确认其 Usage 属性是否显示 "Journal"

手动部署的可行性

手动配置支持以下部署可行性:

该图显示了各种部署可行性,包括将 NVMe 用于缓存和容量、将 SSD 用于缓存和容量、将 SSD 用于缓存,以及将混合的 SSD 和 HDD 用于容量。

设置缓存行为

可以重写缓存的默认行为。 例如,即使在全闪存部署中,也可将其设置为缓存读取。 除非你确定默认行为不符合工作负荷,否则我们不建议修改行为。

若要重写行为,请结合 -CacheModeSSD-CacheModeHDD 参数使用 Set-ClusterStorageSpacesDirect cmdlet。 CacheModeSSD 参数设置在为 SSD 提供缓存时的缓存行为。 CacheModeHDD 参数设置在为 HDD 提供缓存时的缓存行为。

可以使用 Get-ClusterStorageSpacesDirect 来验证是否已设置该行为。

示例

首先获取存储空间直通设置:

Get-ClusterStorageSpacesDirect

下面是一些示例输出:

CacheModeHDD : ReadWrite
CacheModeSSD : WriteOnly

然后执行以下操作:

Set-ClusterStorageSpacesDirect -CacheModeSSD ReadWrite

Get-ClusterS2D

下面是一些示例输出:

CacheModeHDD : ReadWrite
CacheModeSSD : ReadWrite

调整缓存大小

应该根据应用程序和工作负荷的工作集(在任何给定时间主动读取或写入的数据)来调整缓存大小。

在使用机械硬盘的混合部署中,调整缓存大小特别重要。 如果活动工作集超过缓存大小,或者活动工作集改变速度太快,则读取缓存未命中次数将会增加,并且需要更频繁地解除暂存写入内容,因而会损害整体性能。

可以使用 Windows 的内置性能监视器 (PerfMon.exe) 实用工具来检查缓存未命中率。 具体而言,可将“群集存储混合磁盘”计数器集中的“缓存未命中读取次数/秒”与部署的整体读取 IOPS 进行比较。 每个“混合磁盘”对应于一个容量驱动器。

例如,绑定到 4 个容量驱动器的 2 个缓存驱动器在每台服务器上产生 4 个“混合磁盘”对象实例。

Performance-Monitor。

不存在通用的法则,但如果过多的读取未命中缓存,则可能表示缓存的大小不足,你应该考虑添加缓存驱动器来扩展缓存。 随时都可以单独添加缓存驱动器或容量驱动器。

后续步骤

若要学习更多存储知识,另请参阅: