了解存储池缓存
了解存储池缓存
存储空间直通是Azure Stack HCI和Windows Server背后的存储虚拟化技术,具有内置的服务器端缓存,可提高存储性能并降低成本。本文详细介绍了存储池缓存的工作原理、配置方法和最佳实践,适合IT技术人员和系统管理员阅读。
适用于:Azure Stack HCI版本22H2和21H2;Windows Server 2022、Windows Server 2019
存储空间直通是Azure Stack HCI和Windows Server背后的存储虚拟化技术,具有内置的服务器端缓存,可最大程度地提高存储性能,同时降低成本。它是在部署时自动配置的一个大规模、持久、实时的读取缓存和写入缓存。在大多数情况下,不需要手动管理。缓存的工作原理取决于存在的驱动器类型。
驱动器类型和部署选项
存储空间直通目前适用于四种类型的驱动器:
驱动器类型 | 描述 |
---|---|
PMem | 持久性内存,这是一种新型低延迟、高性能存储。 |
NVMe | 非易失性内存Express,是指直接位于PCIe总线上的固态硬盘。常见外形规格为2.5英寸U.2、PCIe Add-In-Card(AIC)和M.2。NVMe提供比其他驱动器类型(PMem除外)更高的IOPS和I/O吞吐量,并且延迟更低。 |
SSD | 通过传统SATA或SAS连接的固态硬盘。 |
HDD | 旋转的磁硬盘,以低成本提供庞大的存储容量。 |
这些可以采用各种方式组合在一起,分为两个类别:“全闪存”和“混合”。不支持使用所有HDD的部署。
注意:本文介绍NVMe、SSD和HDD的缓存配置。有关将永久性内存用作缓存的信息,请参阅了解和部署永久性内存。
全闪存部署可能性
全闪存部署旨在最大程度地提高存储性能,不包括HDD。
混合部署可能性
混合部署旨在平衡性能和容量或最大化容量,并包括HDD。
注意:单服务器配置不支持混合部署。所有平面单一存储类型配置(例如所有NVMe或全SSD)是单一服务器唯一支持的存储类型。
自动选择缓存驱动器
在具有多种类型的驱动器的部署中,存储空间直通会自动使用速度最快的所有驱动器进行缓存。剩余驱动器用于增加存储容量。
根据以下层次结构确定哪种类型为“最快”。
例如,如果你有NVMe和SSD,那么NVMe就是为SSD提供缓存。如果有SSD和HDD,则SSD会为HDD提供缓存功能。
注意:缓存驱动器不会为群集提供可用存储容量。缓存中存储的所有数据也会存储在其他位置,或者将在从缓存中移除后存储。这意味着集群的总原始存储容量仅为容量硬盘的总和。
当所有驱动器都属于同一类型时,不会自动配置任何缓存。可以选择手动配置具有更高耐久性的驱动器,以对相同类型的低耐久性驱动器进行缓存——请参阅手动配置章节以了解具体步骤。
提示:在某些情况下,使用存储池缓存没有意义。例如,在全NVMe或全SSD部署中,特别是非常小规模的情况下,没有驱动器空间被占用用于缓存可以提高存储效率并最大化性能。同样,小型远程或分支机构部署可能具有有限的缓存驱动器空间。
自动设置缓存行为
缓存的行为是根据正在缓存的驱动器的类型自动确定的。为闪存驱动器(如SSD的NVMe缓存)进行缓存时,只会缓存写入。当用于机械硬盘(HDD)的缓存由固态硬盘(SSD)提供时,读写操作都会被缓存。
全闪存部署的写入缓存
缓存可用于全闪存方案,例如使用NVMe作为缓存来加速SSD的性能。在全闪存部署中,缓存操作仅限于写入。这减少了容量驱动器的磨损,因为许多写入和重写可以在缓存中合并,然后仅根据需要进行卸载,从而减少容量驱动器的累积流量并延长其寿命。因此,我们建议为缓存选择更高耐用性、写入优化的驱动器。合理来说,容量驱动器的写入耐力可能较低。
由于读取不会显著影响闪存的寿命,并且SSD普遍提供低读取延迟,因此读取不会被缓存:它们直接从存储器中提供(除非数据是最近写入的,因此尚未从缓存中卸出)。这样,缓存就可以完全专用于写入,从而最大程度地提高其有效性。
这会导致写入特征(如写入延迟)由缓存驱动器决定,而读取特征由容量驱动器决定。两者都是一致的、可预测的和统一的。
混合部署的读/写缓存
为HDD缓存时,读取和写入都被缓存,以提供类似闪存的延迟(通常提高约10倍)。读取缓存存储最近和频繁读取的数据,以便快速访问,并最大程度地减少到HDD的随机流量。(由于查找和旋转延迟,随机访问HDD产生了显著的延迟和损失的时间。写入操作被缓存以应对突发的数据流,并像以前一样合并写入和重写,最大程度地减少到容量驱动器的累积流量。)
存储空间直通实现了一种算法,该算法在卸载写入之前对其去随机化,以便模拟出一种看似连续的磁盘IO模式,即使来自工作负荷(例如虚拟机)的实际I/O是随机的。这将最大化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软件定义的存储堆栈的其余部分下方,因此它不具有任何对存储空间或容错等概念的认识。你可以将其视为创建“混合”驱动器(部分是闪存,部分是磁盘),然后呈现给操作系统。与实际的混合驱动器一样,物理介质的更快、较慢部分之间的热和冷数据的实时移动几乎对外部不可见。
鉴于存储空间直通中的复原能力至少是服务器级(这意味着数据副本始终写入不同的服务器,每个服务器最多只能有一个副本),缓存中的数据受益于与非缓存数据相同的复原能力。
例如,使用三向镜像时,任何数据的三个副本将写入不同的服务器,这些副本位于缓存中。无论它们以后是否被取消标记,三个副本始终存在。
驱动器绑定是动态的
缓存驱动器和容量驱动器之间的绑定可以具有任何比率,从1:1到1:12及以上。每当添加或删除驱动器时(例如纵向扩展或发生故障后),它都会动态调整。这意味着可以根据需要单独添加缓存驱动器或容量驱动器。
建议将容量驱动器数提高到缓存驱动器数的倍数,以便进行对称。例如,如果您有4个缓存驱动器,与使用7个或9个容量驱动器相比,使用8个容量驱动器(1:2比例计算)时,性能表现得更均衡。
处理缓存驱动器故障
缓存驱动器发生故障时,任何尚未取消标记的写入都将丢失到本地服务器,这意味着它们仅存在于其他副本(在其他服务器上)。就像任何其他驱动器故障后一样,存储空间会自动利用现存的副本进行恢复。
在短时间内,与丢失的缓存驱动器绑定在一起的容量驱动器显得不健康。一旦缓存重新绑定(自动)且数据修复完成后(自动),它们将恢复显示为健康状态。
这种情况是为什么每个服务器至少需要两个缓存驱动器来保持性能。
然后,可以像替换任何其他驱动器一样替换缓存驱动器。
注意:可能需要关闭电源才能安全地更换Add-In卡(AIC)或M.2外形规格的NVMe。
与其他缓存的关系
Windows软件定义的存储堆栈中还有其他几个不相关的缓存。示例包括存储空间写回缓存和群集共享卷(CSV)内存中读取缓存。
使用Azure Stack HCI时,不应修改存储空间写回缓存的默认行为。例如,不应使用New-Volumecmdlet上的-WriteCacheSize等参数。
可以选择使用CSV缓存,或者不使用——由你决定。它默认在Azure Stack HCI中处于打开状态,但它不会以任何方式与本主题中所述的缓存冲突。在某些情况下,它可以提供宝贵的性能提升。有关详细信息,请参阅将CSV内存中读取缓存与Azure Stack HCI配合使用。
手动配置
对于大多数部署,不需要手动配置。如果需要,请参阅以下部分。
如果需要在设置后更改缓存设备模型,请编辑Health Service的支持组件文档,如Health Service概述中所述。
指定缓存驱动器模型
在所有驱动器都属于相同类型的部署(如全NVMe或全SSD部署)中,没有配置缓存,因为Windows无法区分同一类型的驱动器之间的写入耐力等特征。
为了将更高耐力的驱动器用作同类型低耐力驱动器的缓存,您可以在使用Enable-ClusterS2Dcmdlet时指定驱动器模型,方法是使用-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,并验证其使用情况属性是否显示“日记”来验证你打算用于缓存的驱动器。
手动部署可能性
手动配置可实现以下部署可能性:
设置缓存行为
可以替代缓存的默认行为。例如,你可以将其设置为即使在全闪存部署中缓存读取。除非你确定默认值不适合工作负荷,否则我们不建议修改该行为。
若要替代行为,请使用Set-ClusterStorageSpacesDirectcmdlet及其-CacheModeSSD和-CacheModeHDD参数。CacheModeSSD参数在为SSD缓存时设置缓存行为。CacheModeHDD参数在缓存HDD时设置缓存行为。
可以使用Get-ClusterStorageSpacesDirect来验证是否已设置行为。
例
首先,获取Storage Spaces Direct的设置:
Get-ClusterStorageSpacesDirect
下面是一些示例输出:
CacheModeHDD : ReadWrite
CacheModeSSD : WriteOnly
然后执行以下操作:
Set-ClusterStorageSpacesDirect -CacheModeSSD ReadWrite
Get-ClusterS2D
下面是一些示例输出:
CacheModeHDD : ReadWrite
CacheModeSSD : ReadWrite
调整缓存大小
缓存的大小应适应您的应用程序和负载的工作集(即在任何给定时间被主动读取或写入的数据)。
这在使用硬盘驱动器的混合部署中尤其重要。如果活动工作集超过缓存大小,或活动工作集变化过快,读取缓存未命中的次数会增加,并且写入需要更积极地转储,这会损害整体性能。
可以使用Windows中的内置性能监视器(PerfMon.exe)实用工具检查缓存未命中率。具体而言,可以将群集存储混合磁盘计数器中的缓存未命中读取数/秒与部署的总体读取IOPS进行比较。每个“混合磁盘”对应于一个容量驱动器。
例如,绑定到4个容量驱动器的2个缓存驱动器会导致每个服务器有4个“混合磁盘”对象实例。
没有通用规则,但如果缓存中缺少太多读取,则它可能会被低估,并且应考虑添加缓存驱动器以扩展缓存。可以根据需要单独添加缓存驱动器或容量驱动器。
后续步骤
有关其他存储知识,另请参阅:
- 容错和存储效率
- 群集和池仲裁
本文原文来自微软官方文档