了解和部署永久性内存

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

重要

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

永久性内存(或 PMem)是一种新型内存技术,它通过电源循环来保留其内容并可用作顶层存储,正因如此,人们将 PMem 称为“存储类内存”或 SCM。 本文提供有关永久性内存的背景信息,并介绍如何在 Azure Stack HCI 和 Windows Server 中将其部署为顶层存储。

什么是永久性内存?

永久性内存是一种适合插入标准 DIMM (内存) 插槽的非易失性介质。 其速度比 DRAM 慢,但吞吐量比 SSD 和 NVMe 更高。 与 DRAM 相比,永久性内存模块的容量要大得多,每 GB 价格也更低,不过仍比 NVMe 更昂贵。 即使系统由于意外断电、用户启动的关机或系统崩溃而关机,内存中的内容也仍会得到保留。 这意味着,可将永久性内存模块用作超快的永久性存储。

Azure Stack HCI 和 Windows Server 2019 支持将永久性内存用作缓存或容量驱动器。 但是,按照给定的定价模型,在用作缓存或者在提供少量的专用存储用于保存内存映射数据时,永久性内存可以发挥最大的价值。 永久性内存驱动器在大多数情况下将自动用作缓存驱动器,速度较慢的永久性内存将用作容量驱动器。 有关如何设置缓存和容量驱动器的详细信息,请参阅了解存储池缓存规划卷

永久性内存的概念

本部分介绍一些基本概念,需要理解这些概念才能在 Windows Server 和 Azure Stack HCI 环境中部署永久性内存,以减少 I/O 瓶颈并提高性能。

访问方法

可通过两种方法访问永久性内存。 它们是:

  • 块访问,这类似于访问出于应用兼容性而使用的存储。 在此配置中,数据像平时那样流经文件系统和存储堆栈。 可将此配置与 NTFS 和 ReFS 结合使用,在大多数用例中,这是建议的做法。
  • 直接访问 (DAX),这类似于为了实现最低延迟而直接访问普通的内存。 DAX 只能与 NTFS 结合使用。 不当地使用 DAX 可能会导致数据丢失。 我们强烈建议在启用块转换表 (BTT) 的情况下使用 DAX,以缓解损毁式写入的风险。 有关详细信息,请参阅了解和配置 DAX

警告

Azure Stack HCI 环境不支持 DAX。 Azure Stack HCI 仅支持在启用 BTT 的情况下进行块访问。

区域

区域是包含一个或多个永久性内存模块的集。 区域通常是作为交错集创建的,其中的多个永久内存模块显示为单个逻辑虚拟地址空间,以便于提高吞吐量。 为了提高可用带宽,相邻的虚拟地址分散在多个永久性内存模块中。 通常可以在服务器平台的 BIOS 中创建区域。

PmemDisk

若要将永久性内存用作存储,必须至少定义一个 PmemDisk。PmemDisk 是主机上的一个虚拟硬盘 (VHD),枚举为虚拟机 (VM) 中的 PmemDisk。 PmemDisk 是非易失性内存的连续寻址范围,可将其视为硬盘分区或 LUN。 可以使用 Windows PowerShell cmdlet 创建多个 PmemDisk,以划分可用的原始容量。 每个永久性内存模块包含一个用于存储配置元数据的标签存储区 (LSA)。

块转换表

与固态硬盘不同,永久性内存模块无法防范在遇到电源故障或系统中断时可能发生的“损毁式写入”,从而使数据面临风险。 BTT 可以缓解这一风险,因为它可为永久性内存设备提供原子扇区更新语义,在本质上,它是启用类似于块的扇区写入,在发生故障时,使应用可以避免将新旧数据混合在一起。 我们强烈建议在几乎所有情况下都启用 BTT。 由于 BTT 是 PmemDisk 的一个属性,因此必须在创建 PmemDisk 时启用它。

在块访问模式下,我们建议使用 BTT,因为所有数据都将使用块语义。 BTT 在 DAX 模式下也很有用,因为即使应用程序的数据操作不使用块语义,但元数据操作也仍会使用块语义。 即使所有应用程序操作都使用具有 DAX 语义的内存映射文件,元数据操作也仍可能会发生损毁式写入;因此,启用 BTT 仍很有用。

支持的硬件

下表显示了 Azure Stack HCI 和 Windows Server 支持的永久性内存硬件。 Windows Server 2019(包括存储空间直通)完全支持永久性内存。

永久性内存技术 Windows Server 2016 Azure Stack HCI v20H2/Windows Server 2019
处于永久性模式的 NVDIMM-N 支持 支持
处于应用直接访问模式的 Intel Optane™ DC 永久性内存 不支持 支持
处于内存模式的 Intel Optane™ DC 永久性内存 支持 支持

Intel Optane DC 永久性内存支持“内存”(易失性)和“应用直接访问”(永久性)工作模式 。 若要将永久性内存模块用作存储(服务器工作负载的主要用例),必须使用应用直接访问模式。 内存模式实质上使用永久性内存作为慢速 RAM,这通常不符合服务器工作负载的性能要求。 内存模式不同于 DAX,后者是可使用类似于内存的语义访问的永久性存储卷。

工作模式通常由原始设备制造商预先配置。

注意

如果重启的系统包含多个处于应用直接访问模式的、划分为多个 PmemDisk 的 Intel® Optane™ 永久性内存模块,你可能无法访问某些或全部相关的逻辑存储磁盘。 此问题发生在低于 1903 的 Windows Server 2019 版本上。

之所以无法进行这种访问,是原因永久性内存模块未经训练,或者在系统启动时发生故障。 在这种情况下,系统中任何永久性内存模块上的所有 PmemDisk 都会发生故障,包括那些未以物理方式映射到有故障模块的 PmemDisk。

若要恢复对所有 PmemDisk 的访问,请更换有故障的模块

如果 Windows Server 2019 版本 1903 或更高版本上的某个模块发生故障,则你只是无法访问以物理方式映射到受影响模块的 PmemDisk;其他 PmemDisk 不受影响。

配置永久性内存

如果使用的是 Intel Optane 永久性内存,请按照此处的说明进行操作。 如果使用的是其他供应商提供的永久性内存模块,请查阅相关文档。

若要创建支持 BTT 的 PmemDisk,请使用 New-VHD cmdlet:

New-VHD E:\pmemtest.vhdpmem -Fixed -SizeBytes 1GB -AddressAbstractionType BTT

VHD 扩展必须是“vhdpmem”。

还可以使用 Convert-VHD cmdlet,将未启用 BTT 的 VHD 转换为已启用 BTT 的 VHD(反之亦然):

Convert-VHD .\pmemtest_nobtt.vhdpmem -AddressAbstractionType BTT -DestinationPath pmemtest_btt.vhdpmem

转换后,新 VHD 将具有与原始 VHD 相同的命名空间 GUID。 这可能会导致出现问题,尤其是两者均附加到同一个 VM 的情况下。 若要为转换后的 VHD 创建新命名空间 UUID,请使用 Set-VHD cmdlet:

Set-VHD -ResetDiskIdentifier .\pmemtest_btt.vhdpmem

了解交错集

通常可以在服务器平台的 BIOS 中创建交错集,使多个永久性内存设备在主机操作系统中显示为单个磁盘,从而提高该磁盘的吞吐量。

注意

Windows Server 2016 不支持永久性内存模块的交错集。

如前所述,永久性内存模块驻留在标准 DIMM(内存)插槽中,这使得数据更靠近处理器。 此配置可以降低延迟并提高提取性能。 若要进一步提高吞吐量,可以通过两个或更多个永久性内存模块来创建 n 向交错集,以将读/写操作条带化。 最常见的配置是双向或四向交错。

可以使用 Get-PmemDisk PowerShell cmdlet 来查看此类逻辑磁盘的配置,如下所示:

Get-PmemDisk

DiskNumber Size   HealthStatus AtomicityType CanBeRemoved PhysicalDeviceIds UnsafeShutdownCount
---------- ----   ------------ ------------- ------------ ----------------- -------------------
2          252 GB Healthy      None          True         {20, 120}         0
3          252 GB Healthy      None          True         {1020, 1120}      0

可以看到,逻辑 PMem 磁盘 2 使用了物理设备 Id20 和 Id120,逻辑 PMem 磁盘 3 使用了物理设备 Id1020 和 Id1120。

若要检索有关逻辑驱动器使用的交错集的详细信息,请运行 Get-PmemPhysicalDevice cmdlet:

(Get-PmemDisk)[0] | Get-PmemPhysicalDevice

DeviceId DeviceType           HealthStatus OperationalStatus PhysicalLocation FirmwareRevision Persistent memory size Volatile memory size
-------- ----------           ------------ ----------------- ---------------- ---------------- ---------------------- --------------------
20       Intel INVDIMM device Healthy      {Ok}              CPU1_DIMM_C1     102005310        126 GB                 0 GB
120      Intel INVDIMM device Healthy      {Ok}              CPU1_DIMM_F1     102005310        126 GB                 0 GB

配置交错集

若要配置交错集,请运行 Get-PmemUnusedRegion cmdlet 来查看未分配给系统中逻辑永久性内存磁盘的所有永久性内存区域:

Get-PmemUnusedRegion

RegionId TotalSizeInBytes DeviceId
-------- ---------------- --------
       1     270582939648 {20, 120}
       3     270582939648 {1020, 1120}

若要查看系统中的所有 PMem 设备信息(包括设备类型、位置、运行状况和工作状态等),请运行 Get-PmemPhysicalDevice cmdlet:

Get-PmemPhysicalDevice

DeviceId DeviceType           HealthStatus OperationalStatus PhysicalLocation FirmwareRevision Persistent memory size Volatile
                                                                                                                      memory size
-------- ----------           ------------ ----------------- ---------------- ---------------- ---------------------- --------------
1020     Intel INVDIMM device Healthy      {Ok}              CPU2_DIMM_C1     102005310        126 GB                 0 GB
1120     Intel INVDIMM device Healthy      {Ok}              CPU2_DIMM_F1     102005310        126 GB                 0 GB
120      Intel INVDIMM device Healthy      {Ok}              CPU1_DIMM_F1     102005310        126 GB                 0 GB
20       Intel INVDIMM device Healthy      {Ok}              CPU1_DIMM_C1     102005310        126 GB                 0 GB

由于我们有一个可用的但未使用的 PMem 区域,因此可以创建新的永久性内存磁盘。 可以运行以下 cmdlet,使用尚未使用的区域来创建多个永久性内存磁盘:

Get-PmemUnusedRegion | New-PmemDisk
Creating new persistent memory disk. This may take a few moments.

完成此操作后,可通过运行以下命令来查看结果:

Get-PmemDisk

DiskNumber Size   HealthStatus AtomicityType CanBeRemoved PhysicalDeviceIds UnsafeShutdownCount
---------- ----   ------------ ------------- ------------ ----------------- -------------------
2          252 GB Healthy      None          True         {20, 120}         0
3          252 GB Healthy      None          True         {1020, 1120}      0

请注意,可以运行 Get-PhysicalDisk | Where MediaType -eq SCM(而不是 Get-PmemDisk)来获得相同的结果。 新建的永久性内存磁盘一一对应于 PowerShell 和 Windows Admin Center 中显示的驱动器。

更换永久性内存

如果需要更换有故障的模块,则必须重新预配 PMem 磁盘(请参阅前面所述的步骤)。

进行故障排除时,可能需要使用 Remove-PmemDisk。 此 cmdlet 删除特定的永久性内存磁盘。 可运行以下 cmdlet 来删除当前所有永久性内存磁盘:

Get-PmemDisk | Remove-PmemDisk

cmdlet Remove-PmemDisk at command pipeline position 1
Supply values for the following parameters:
DiskNumber: 2

This will remove the persistent memory disk(s) from the system and will result in data loss.
Remove the persistent memory disk(s)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
Removing the persistent memory disk. This may take a few moments.

重要

删除永久性内存磁盘会导致该磁盘上的数据丢失。

可能需要运行的另一个 cmdlet 是 Initialize-PmemPhysicalDevice。 此 cmdlet 初始化物理永久性内存设备上的标签存储区,并可以清除设备上已损坏的标签存储信息。

Get-PmemPhysicalDevice | Initialize-PmemPhysicalDevice

This will initialize the label storage area on the physical persistent memory device(s) and will result in data loss.
Initializes the physical persistent memory device(s)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): A
Initializing the physical persistent memory device. This may take a few moments.
Initializing the physical persistent memory device. This may take a few moments.
Initializing the physical persistent memory device. This may take a few moments.
Initializing the physical persistent memory device. This may take a few moments.

重要

Initialize-PmemPhysicalDevice 会导致永久性内存中的数据丢失。 请仅将它用作解决永久性内存相关问题的最后手段。

永久性内存在 Microsoft Ignite 2018 中的运作

要了解永久性内存的一些优势,请观看来自 Microsoft Ignite 2018 的此视频

任何提供容错功能的存储系统一定会创建分布式的写入副本。 此类操作必须穿越网络并放大后端写入流量。 因此,只需度量读取通常就能获得绝对最大的 IOPS 基准数字,尤其是存储系统经过共识性的优化,尽可能地从本地副本读取时。 存储空间直通经过优化,它就是以这种方式读取的。

在使用仅限读取操作度量时,群集提供了 13,798,674 IOPS。

如果你仔细观看视频,就会发现更令人惊愕的是延迟。 尽管超过了 1370 万 IOPS,但 Windows 中的文件系统报告的延迟却始终小于 40 µs! (µs 是微秒的符号,即百万分之一秒。)这种速度比当今的典型全闪存供应商引以为傲的推广产品快了一个数量级。

此外,Windows Server 2019 中的存储空间直通和 Intel® Optane™ DC 永久性内存提供了突破性的性能。 此项 HCI 基准超过了 1370 万 IOPS,是之前行业领先的 670 万 IOPS 基准的两倍有余,加上它还提供可预测的极低延迟。 除此之外,这一次我们只需要 12 个服务器节点 - 比之前少了 25%。

测试硬件是配置为使用三向镜像和分隔式 ReFS 卷的、由 12 个服务器构成的群集,其中包括:12 个 Intel® S2600WFT,384 GiB 内存;2 个 28 核“CascadeLake”,用作缓存的 1.5 TB Intel® Optane™ DC 永久性内存;用作容量驱动器的 32 TB NVMe (4 x 8 TB Intel® DC P4510);2 个 Mellanox ConnectX-4,25 Gbps。

下表显示了完整的性能数字。

基准 性能
4K 100% 随机读取 1380 万 IOPS
4K 90/10% 随机读/写 945 万 IOPS
2 MB 顺序读取 549 GB/s 吞吐量

后续步骤

如需相关信息,另请参阅: