Hyper-V 存储 I/O 性能

本文探讨了在虚拟机 (VM) 中优化存储输入/输出 (I/O) 性能的不同选项和注意事项。 存储 I/O 路径跨越四个连续阶段:

  1. 来宾存储堆栈
  2. 主机虚拟化层
  3. 主机存储堆栈
  4. 物理磁盘

以下部分介绍了每个阶段可能的优化。

虚拟控制器

Hyper-V 提供三种类型的虚拟控制器:

  • 集成驱动电子 (IDE)

  • 小型计算机系统接口 (SCSI)

  • 虚拟光纤通道主机总线适配器 (HBA)

IDE

我们建议您仅将 IDE 磁盘用于 OS 磁盘。 OS 磁盘的性能限制取决于其设备的最大 I/O 大小。

IDE 控制器是向 VM 公开 IDE 磁盘的模拟控制器。 对于运行早期版本的 Windows 而没有 VM 集成服务的客户机 VM,Hyper-V 这种类型的控制器是唯一的选项。 集成服务提供的 IDE 过滤器驱动程序可以比模拟的 IDE 控制器更好地执行磁盘 I/O。

SCSI (SAS 控制器)

虚拟 SCSI 控制器向 VM 公开 SCSI 磁盘。 每个 SCSI 控制器最多支持 64 个设备。 SCSI 路径不是模拟的,这使其成为除 OS 磁盘之外的任何磁盘的首选控制器。 Windows Server 2012 R2 及更高版本支持 SCSI 控制器,但仅限于将控制器报告为串行连接 SCSI (SAS) 以支持共享虚拟硬盘 (VHDX) 的情况。

为了获得最佳性能,我们建议您将多个磁盘连接到单个虚拟 SCSI 控制器。 只有在没有其他选项来扩展连接到 VM 的磁盘数量时,才应创建更多控制器。

虚拟光纤通道 HBA

配置虚拟光纤通道 HBA 以允许 VM 直接访问光纤通道和以太网光纤通道 (FCoE) 逻辑单元号 (LUN)。 虚拟光纤通道磁盘绕过根分区中的 NTFS 文件系统,从而减少了存储 I/O 中央处理器 (CPU) 的使用。 虚拟光纤通道磁盘非常适合大型数据驱动器和来宾群集方案中多个 VM 之间共享的驱动器。

要使用虚拟光纤通道磁盘,必须在主机上安装一个或多个光纤通道 HBA。 每个主机 HBA 都必须使用支持 Windows Server 2016 虚拟光纤通道或 N_Port ID 虚拟化 (NPIV) 功能的 HBA 驱动程序。 存储区域网络 (SAN) 结构还应支持 NPIV,并且您应该在支持 NPIV 的光纤通道拓扑中为光纤通道配置 HBA 端口。

要最大限度地提高具有多个 HBA 的主机上的吞吐量,我们建议您在 Hyper-V VM 中配置多个虚拟 HBA。 您可以为每个 VM 配置最多 4 个 HBA。 Hyper-V 会自动平衡虚拟 HBA 与访问同一虚拟 SAN 的主机 HBA。

虚拟磁盘

虚拟磁盘由虚拟控制器向 VM 公开,可以是主机上的虚拟硬盘或传递磁盘。

虚拟磁盘采用 VHD 或 VHDX 格式。 每种格式都支持三种类型的虚拟硬盘文件。

如果将部署升级到 Windows Server 2016 或更高版本,建议将所有 VHD 文件转换为 VHDX 格式。 有关详细信息,请参阅 VHDX 格式

VHD 格式

Hyper-V 的更高版本包括对其 VHD 格式的改进,以便更好地对齐。 Windows Server 2012 及更高版本中的 Hyper-V 同时支持 VHDX 和 VHD 格式,而早期版本仅支持 VHD 格式。 因此,更高版本的 Hyper-V 在大型扇区磁盘上的性能会更好。

在 Windows Server 2012 或更高版本中创建的任何 VHD 都具有最佳的 4 KB 对齐方式。 此对齐格式与早期版本的 Windows Server 完全兼容。 但是,对齐属性不支持来自非 4 KB 对齐感知的解析器的新分配,例如来自早期版本的 Windows Server 的解析器或非 Microsoft 解析器。

将磁盘转换为 VHD 格式

将 VHD 从早期版本的 Hyper-V 或 Windows Server 迁移到更高版本时,系统不会自动将磁盘转换为 VHD 格式。

您可以通过打开 PowerShell 窗口并运行以下命令将现有虚拟磁盘转换为 VHD:

Convert-VHD –Path <SourceDiskFilePath> –DestinationPath <ConvertedDiskFilePath>

例如,如果您计划将驱动器 E 中命名 test.vhd 的源磁盘转换为同一文件夹中命名 test-converted.vhd 的已重命名转换磁盘,请运行以下命令:

Convert-VHD –Path E:\vms\testvhd\test.vhd –DestinationPath E:\vms\testvhd\test-converted.vhd

注释

转换 VHD 时,PowerShell 会根据 Copy from Source disk (从源磁盘复制 ) 选项使用源 VHD 中的数据。 有关详细信息,请参阅 Convert-VHD

检查磁盘对齐

转换磁盘后,您可以通过在 PowerShell 中运行Get-VHD命令来检查其 Alignment 变量,以确保它使用最佳的 4 KB 对齐方式。 确保对源磁盘和转换后的磁盘运行命令,然后比较值以确保转换后的磁盘可识别 4 KB 对齐。

要查看磁盘的对齐情况:

  1. 打开 PowerShell 窗口。

  2. 运行命令 Get-VHD 以查看源磁盘的对齐设置。

    Get-VHD –Path <SourceVHDFilePath>
    
  3. 在输出中,请注意 property 的值 Alignment 。 在此示例中,值为 0,这意味着磁盘不是 4 KB 对齐感知的。

    Path                    : <SourceVHDFilePath>
    VhdFormat               : VHD
    VhdType                 : Dynamic
    FileSize                : 69245440
    Size                    : 10737418240
    MinimumSize             : 10735321088
    LogicalSectorSize       : 512
    PhysicalSectorSize      : 512
    BlockSize               : 2097152
    ParentPath              :
    FragmentationPercentage : 10
    Alignment               : 0
    Attached                : False
    DiskNumber              :
    IsDeleted               : False
    Number                  :
    
  4. 再次运行该 Get-VHD 命令,但这次使用已转换磁盘的文件路径。

    Get-VHD –Path <ConvertedDiskFilePath>
    
  5. 在输出中,检查属性的值 Alignment 。 该值应为 1,这意味着磁盘已成功转换为较新的 VHD 格式,并且可识别 4 KB 对齐。

    Path                    : <ConvertedDiskFilePath>
    VhdFormat               : VHD
    VhdType                 : Dynamic
    FileSize                : 69369856
    Size                    : 10737418240
    MinimumSize             : 10735321088
    LogicalSectorSize       : 512
    PhysicalSectorSize      : 512
    BlockSize               : 2097152
    ParentPath              :
    FragmentationPercentage : 0
    Alignment               : 1
    Attached                : False
    DiskNumber              :
    IsDeleted               : False
    Number                  :
    

VHDX 格式

VHDX 是 Windows Server 2012 中引入的更新硬盘格式。 这种格式可以创建容量高达 64 TB 的弹性高性能虚拟磁盘。

如果要升级到 Windows Server 2016 或更高版本,建议将所有 VHD 文件转换为 VHDX 格式。 仅当需要将 VM 移动到不支持 VHDX 格式的早期 Hyper-V 版本时,才将文件保留为 VHD 格式。

以下是 VHDX 格式的一些优点:

  • 支持高达 64 TB 的虚拟硬盘存储容量

  • 通过记录对 VHDX 元数据结构的更新,防止在电源故障期间损坏数据

  • 根据配置文件的用户要记录的内容(例如作系统版本或应用的修补程序)存储文件的自定义元数据

VHDX 格式还提供多项性能功能:

  • 改进了虚拟硬盘格式的对齐方式,提高了大型扇区磁盘的性能

  • 动态磁盘和差异磁盘的块大小更大,使磁盘能够根据工作负载要求进行调整

  • 一个 4 KB 逻辑扇区虚拟磁盘,用于在专为 4 KB 扇区设计的应用程序和工作负载使用时支持更高的性能

  • 高效表示数据以生成更小的文件大小,并允许底层物理存储设备回收未使用的空间

    注释

    剪裁需要直通或 SCSI 磁盘以及与 trim 兼容的硬件。

虚拟文件

有三种类型的 VHD 文件:

  • 固定文件用于提高弹性和性能,当托管值上的存储未受到主动监控时,您应该使用它们。 确保在运行时扩展 VHD 文件时有足够的磁盘空间。 您可以在任何磁盘格式上使用它们。

  • 动态文件用于保证弹性,并根据部署需要分配磁盘空间。 只能在 VHDX 上使用它们。

  • 差异文件可使 VM 快照链保持较短,以保持良好的磁盘 I/O 性能。 您可以在任何磁盘格式上使用它们。

固定文件类型

当您创建固定的 VHD 文件时,系统会为其分配空间。 固定文件不太可能碎片化,从而在单个 I/O 拆分为多个 I/O 时降低 I/O 吞吐量。 它还具有三个 file 选项中最低的 CPU 开销,因为读取和写入作不需要查找块的映射。

当您需要最佳弹性和性能时,我们建议您使用 fixed 文件类型。

动态文件类型

当您创建动态 VHD 文件时,系统会按需为其分配空间。 文件中的块从已分配的块开始,文件中没有空间支持未分配的块。 当数据块收到其第一次写入时,虚拟化堆栈必须在 VHD 文件中为该数据块分配空间,然后更新元数据。 此分配会增加写入所需的磁盘 I/O 数量,从而增加 CPU 使用率。 在元数据中查找数据块的映射时,对现有数据块的读取和写入会产生磁盘访问和 CPU 开销。

如果您使用的是 VHDX 文件,我们建议您在不主动监控托管卷上的存储时使用动态文件类型。 确保在运行时扩展 VHD 文件时有足够的磁盘空间。

差异文件类型

差异文件是存储对磁盘的写入的 VM 的快照。 如果写入没有现有写入的块,系统会在 VHD 文件中分配空间,就像动态扩展的 VHD 一样。 如果块已包含写入,则系统将从 VHD 文件中执行读取作。 否则,它将为父 VHD 文件中的块提供服务。 在这两种情况下,系统都会读取元数据以确定数据块映射。 与固定 VHD 文件相比,对此 VHD 的读取和写入可能会消耗更多的 CPU,并导致更多的 I/O。

当只有几个快照时,存储 I/O 可能会使用比正常情况更多的 CPU,但除了高度 I/O 密集型服务器工作负载外,它不会明显影响性能。 创建和使用大型 VM 快照链确实会导致性能问题。 在差异文件中,系统需要检查许多不同的差异 VHD 中请求的块,以便从 VHD 中读取。 如果您使用差异文件,我们建议您应保持快照链较短,以保持良好的磁盘 I/O 性能。

大小注意事项

在规划磁盘优化时,应考虑块大小和扇区大小。 本节介绍调整数据块和扇区大小的建议。

块大小

由于数据块大小会显著影响性能,因此我们建议您将数据块大小与使用磁盘的工作负载的分配模式相匹配。 如果应用程序以 16 MB 的块分配块,则理想情况下应使用 16 MB 的 VHD 块大小。 大于 2 MB 的块大小只能在使用 VHDX 文件格式的 VHD 上使用。 当块大小大于随机 I/O 工作负载的分配模式时,它会增加 VHD 在主机上使用的空间量。

扇区大小

软件组织通常依赖于 512 字节的磁盘扇区,但行业标准正在转向 4 KB 磁盘扇区。 为了减少扇区大小变化可能引起的兼容性问题,硬盘驱动器供应商引入了一种称为 512 仿真驱动器 (512e) 的过渡大小。

仿真驱动器具有 4 KB 磁盘扇区本机驱动器提供的一些优势,例如改进的格式化效率和改进的纠错码 (ECC) 方案。 在磁盘接口上公开 4 KB 扇区大小时,仿真驱动器的兼容性问题较少。

要充分利用 4 KB 扇区,建议使用 VHDX 格式,而不是 512 字节的磁盘扇区。 要减少磁盘大小之间的兼容性问题,请实施 512e 驱动器以进行过渡大小调整。

支持 512e 磁盘的过渡大小

512e 磁盘只能根据物理扇区执行写入作。 这种类型的磁盘不能直接写入系统将其发送到的 512 字节扇区。 磁盘有一个内部进程,该进程使写入作成为可能,其中按以下顺序涉及读取Modify-Write (RMW)作:

  • 首先,磁盘将 4 KB 物理扇区读取到其内部缓存。 缓存包含写入作中引用的 512 字节逻辑扇区。

  • 接下来,磁盘修改 4 KB 缓冲区中的数据以包含更新的 512 字节扇区。

  • 最后,磁盘将更新的 4 KB 缓冲区写回磁盘上的物理扇区。

RMW 进程对性能的总体影响取决于工作负载。 RMW 进程可能会导致虚拟硬盘性能下降,原因如下:

  • 动态和差异化 VHD 在数据有效负载的前面具有 512 字节的扇区位图。 页脚、页眉和父定位符与 512 字节的扇区对齐。 虚拟硬盘驱动程序通常会执行 512 字节的写入作来更新这些结构,这会导致磁盘运行 RMW 进程。

  • 应用程序通常以 4 KB 大小的倍数执行读取和写入作,因为 4 KB 是 NTFS 的默认群集大小。 动态和差分虚拟硬盘在数据负载块前面有一个 512 字节的扇区位图。 此位图会导致 4 KB 块不与物理 4 KB 边界对齐。 下图显示了一个突出显示的 VHD 4 KB 块,该块与物理 4 KB 边界不对齐。

    未与物理 4 KB 边界对齐的 VHD 4 KB 块的关系图。

当前解析器为更新负载数据而执行的每次 4 KB 写入作都会导致对磁盘上的两个数据块进行两次读取。 然后,系统会更新块并将其写回两个磁盘块。 Windows Server 2016 中的 Hyper-V 功能可减轻对 VHD 堆栈上 512e 磁盘的一些性能影响。 Hyper-V 准备结构,以便与 VHD 格式的 4 KB 边界对齐。 缓解措施可避免 RMW 对访问虚拟硬盘文件中的数据和更新虚拟硬盘元数据结构的影响。

如前所述,从早期版本的 Windows Server 复制的 VHD 不会自动与 4 KB 对齐。 您可以通过在命令中使用 Copy from Source disk (从源磁盘复制 ) 选项来 Convert-VHD 手动将磁盘转换为最佳对齐方式。

默认情况下,VHD 公开的物理扇区大小为 512 字节。 此方法可确保在从早期版本的 Windows Server 迁移应用程序和 VHD 时,依赖于物理扇区大小的应用程序不会受到影响。

默认情况下,系统会创建物理扇区大小为 4 KB 的 VHDX 磁盘,以优化其在常规磁盘和较大扇区磁盘上的性能配置文件。

为了减少磁盘大小之间的兼容性问题,我们建议您实施 512e 驱动器以进行过渡大小调整。 若要充分利用 4 KB 扇区,请使用 VHDX 格式。

本机 4 KB 磁盘

Windows Server 2012 R2 及更高版本中的 Hyper-V 支持 4 KB 本机磁盘。 您还可以通过在虚拟存储堆栈层中实施软件 RMW 算法,将 VHD 磁盘数据存储在 4 KB 本机磁盘上。 该算法将 512 字节的访问和更新请求转换为相应的 4 KB 访问和更新。

由于 VHD 文件只能公开为 512 字节逻辑扇区大小的磁盘,因此可能存在发出 512 字节 I/O 请求的应用程序。 在这种情况下,存储堆栈层的 RMW 算法可以满足请求,并导致性能下降。 对于逻辑扇区大小为 512 字节的 VHDX 磁盘,会出现相同的结果。

您可以将 VHDX 文件配置为公开为 4 KB 逻辑扇区大小的磁盘。 此实施是 4 KB 本机物理设备上托管的磁盘性能的最佳配置。 但是,请确保 4 KB 逻辑扇区大小同时支持使用虚拟磁盘的来宾和应用程序。 VHDX 格式在 4 KB 逻辑扇区大小的设备上正常工作。

我们建议您避免将 4 KB 本机磁盘与 VHD 和 VHDX 文件一起使用,因为这可能会导致性能下降。 当你的方案需要 4 KB 本机磁盘时,应在 4 KB 逻辑扇区大小的设备上使用 VHDX 格式。

直通磁盘

我们建议您避免使用直通磁盘,因为它们在 VM 迁移方案中会引入限制。

将 VM 中的 VHD 直接映射到物理磁盘或逻辑单元号 (LUN) 而不是 VHD 文件称为 直通磁盘直通磁盘 允许您绕过根分区中的 NTFS 文件系统,从而降低存储 I/O 的 CPU 使用率。 但是,使用传递磁盘还存在物理磁盘或 LUN 比 VHD 文件更难在计算机之间迁移的风险。

高级存储功能

本节讨论您应该考虑用于高级存储功能的一些更多性能优化。

存储服务质量 (QoS)

在 Windows Server 2012 R2 及更高版本中,Hyper-V 包括为 VM 上的存储设置某些服务质量 (QoS) 参数的功能。 我们建议您实施存储 QoS 以访问额外的存储参数,为虚拟硬盘设置最大和最小 IOPS 阈值,并监控磁盘性能。 您可以实施这些参数以获得以下好处:

  • 在多租户环境中配置存储性能隔离

  • 指定虚拟硬盘的最大和最小每秒输入/输出作数 (IOPS)

    • 管理员可以限制存储 I/O,以防止一个租户消耗过多的存储资源,从而影响其他租户。 设置最小 IOPS 值,并在系统未达到阈值时接收通知以实现最佳性能。 我们根据标准化 IOPS 指定最大或最小 IOPS 值,其中每 8 KB 数据作为一次 I/O。
  • 当存储 I/O 性能低于定义的阈值时接收通知,以高效运行 VM 工作负载

  • 访问 VM 指标基础架构的存储参数,并使管理员能够监控性能和计费相关参数

但是,还要记住,存储 QoS 具有以下限制:

  • 仅适用于虚拟磁盘

  • 差异磁盘不能在不同的卷上具有父虚拟磁盘

  • 副本站点的 QoS 与主站点分开配置

  • 存储 QoS 不支持共享 VHDX

有关详细信息,请参阅 Hyper-V 的存储服务质量

大型 VM 的 NUMA I/O 注册表设置

Windows Server 2012 及更高版本支持将虚拟非一致性内存访问 (NUMA) 拓扑投影到 Hyper-V VM 中。 NUMA 支持提高了在配置了大量内存的 VM 或 大型 VM 上运行的工作负载的性能。 为了实现这种支持,大型 VM 配置需要在 I/O 吞吐量方面具有可扩展性。 大型 VM 的一个示例是运行 64 个虚拟处理器的 Microsoft SQL Server。

以下 Windows Server 增强功能满足大型 VM 的 I/O 可伸缩性要求:

  • 在来宾设备和主机存储堆栈之间创建更多通信通道。

  • 一种更高效的 I/O 完成机制,涉及在虚拟处理器之间分配中断,以避免代价高昂的处理器间中断。

注册密钥

我们建议您使用 Windows Server NUMA 注册表项设置来提高在大型 VM 上运行的工作负载的性能。

我们添加并更新了一些注册表项,以支持上一节中的增强功能,并允许您调整通道数。 您可以在 中找到 HKLM\System\CurrentControlSet\Enum\VMBUS\<device id>\<instance id>\StorChannel这些条目。

<device id>\<instance id>\路径部分对应于配置中的相关值。 这些注册表项将处理 I/O 完成的虚拟处理器与应用程序分配为 I/O 处理器的虚拟 CPU 保持一致。 系统会根据设备的硬件密钥按适配器配置注册表设置。

以下是需要考虑的两个关键设置:

  • ChannelCount (DWORD) 是部署可以使用的通信通道总数。 最大值为 16。 通道计数默认为等于虚拟处理器数除以 16 的值。

  • ChannelMask (QWORD) 是通道的处理器关联性。 如果您未指定此键设置或将值设置为 0,则通道掩码默认为普通存储或网络通道的现有通道分配算法。 默认作可确保您的存储通道不会与网络通道冲突。

卸载数据传输集成

我们建议您使用卸载数据传输 (ODX)作来确保 VM 工作负载可以像在物理环境中一样使用启用了 ODX 的存储。

VHD 的关键维护任务(如合并、移动和压缩)涉及复制大量数据。 当前复制数据的方法需要系统将数据读取和写入到不同的位置,这非常耗时,并且会占用 CPU 和内存资源,而这些资源本可用于维护 VM。

存储区域网络 (SAN) 供应商可以提供称为 ODX 的硬件功能。 此功能为大量数据提供近乎即时的复制作。 ODX 允许系统(而不是磁盘)指定如何将特定数据集从一个位置移动到另一个位置。

Windows Server 2012 及更高版本中的 Hyper-V 支持 ODX作,以将复制的数据从来宾作系统传递到主机硬件。 工作负载可以使用启用了 ODX 的存储,就像在非虚拟化环境中一样。 Hyper-V 存储堆栈还可以在 VHD 的维护作期间发出 ODX作,例如在大型数据迁移期间合并磁盘和存储迁移元作。

取消映射通知集成

建议使用取消映射通知来提高 VHDX 文件的效率,并让基础物理存储设备回收未使用的空间。

VHD 文件存在于存储卷上,它们与其他文件共享可用空间。 由于 VHD 文件的文件大小往往很大,因此可能会占用大量空间。 对存储空间的更大需求会影响 IT 硬件预算,这意味着您应该尽可能优化物理空间的使用。

在 Windows Server 2012 之前的 Windows Server 版本中,来宾作系统和 Hyper-V 主机中的 Windows 存储堆栈存在限制,导致它们无法优化存储空间。 当应用程序删除 VHD 中的内容时,存储空间仍处于废弃状态。 系统不会将已删除的信息通知 VHD 或物理存储设备,这会阻止 Hyper-V 存储堆栈优化基于 VHD 的虚拟磁盘文件的空间。 因此,底层存储设备无法回收已删除数据过去占用的现在未使用的空间。

从 Windows Server 2012 开始,Hyper-V 支持 取消映射通知。 此功能允许 VHDX 文件将已删除的数据报告给存储堆栈,从而通过保持文件大小修剪并让堆栈回收未使用的存储空间用于其他用途来最大限度地提高效率。

只有特定于 Hyper-V 的 SCSI、启发式 IDE 和虚拟光纤通道控制器才允许 unmap 来自来宾作系统的命令到达主机虚拟存储堆栈。 在 VHD 上,只有格式化为 VHDX 的虚拟磁盘支持 unmap 来自来宾作系统的命令。