Hyper-V 存储 I/O 性能

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

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

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

虚拟控制器

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

  • 集成驱动电子设备 (IDE)

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

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

IDE

建议操作系统磁盘仅使用 IDE 磁盘。 操作系统磁盘的性能限制取决于其设备的最大 I/O 大小。

IDE 控制器是用于向虚拟机公开 IDE 磁盘的仿真控制器。 此类控制器是运行早期 Windows 版本且没有 Hyper-V 虚拟机集成服务的来宾虚拟机的唯一选项。 集成服务提供的 IDE 筛选器驱动程序在执行磁盘 I/O 方面可能比仿真 IDE 控制器更好。

SCSI(SAS 控制器)

虚拟 SCSI 控制器向虚拟机公开 SCSI 磁盘。 每个 SCSI 控制器最多可支持 64 台设备。 SCSI 路径不是模拟的,因而它成了除 OS 磁盘以外的任何磁盘的首选控制器。 Windows Server 2012 R2 及更高版本支持 SCSI 控制器,但仅在将控制器报告为支持共享虚拟硬盘 (VHDX) 的串行附加 SCSI (SAS) 的情况下才支持。

为确保最佳性能,建议将多个磁盘连接到单个虚拟 SCSI 控制器。 仅当没有其他选项可用来缩放连接到虚拟机的磁盘数量时,才应创建更多控制器。

虚拟光纤通道 HBA

可将虚拟光纤通道 HBA 配置为允许虚拟机直接访问光纤通道和基于以太网的光纤通道 (FCoE) 的逻辑单元号 (LUN)。 虚拟光纤通道磁盘绕过根分区中的 Windows NT 文件系统,从而减少了存储 I/O 的 中心处理单元 (CPU) 使用率。 虚拟光纤通道磁盘非常适合大型数据驱动器以及来宾群集应用场景中在多个虚拟机之间共享的驱动器。

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

为了尽可能利用安装了多个 HBA 的主机的吞吐量,我们建议在 Hyper-V 虚拟机中配置多个虚拟 HBA。 每个虚拟机最多可以配置四个 HBA。 Hyper-V 会自动均衡访问同一虚拟 SAN 的虚拟 HBA 和主机 HBA。

虚拟磁盘

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

虚拟磁盘以 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 中的 VHD 分析程序,或非 Microsoft 分析程序)中的新分配。

将磁盘转换为 VHD 格式

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

要将现有的虚拟磁盘转换为 VHD,请打开 PowerShell 窗口并运行以下命令:

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 会基于“从源磁盘复制”选项,使用源 VHD 中的数据。 有关详细信息,请参阅 Convert-VHD

检查磁盘对齐

转换磁盘后,可以在 PowerShell 中运行 Get-VHD 命令来检查其 Alignment 变量,从而确保使用的最佳 4-KB 对齐。 请确保为源磁盘和转换后的磁盘运行该命令,然后比较这些值来确保转换后的磁盘能够感知 4 KB 对齐。

查看磁盘的对齐:

  1. 打开 PowerShell 窗口。

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

    Get-VHD –Path <SourceVHDFilePath>
    
  3. 在输出中,注意 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 格式。 仅当需要将虚拟机迁移到不支持 VHDX 格式的早期版本 Hyper-V 时,才保留 VHD 格式的文件。

VHDX 格式具有以下优点:

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

  • 可通过记录对 VHDX 元数据结构的更新,保护数据在电源发生故障时不受损坏

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

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

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

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

  • 4 KB 逻辑扇区虚拟磁盘,当由专用于 4 KB 扇区的应用程序和工作负载使用时可提供更高性能

  • 高效地表示数据,这可以使得文件大小变得更小并且允许基础物理存储设备回收未使用的空间

    注意

    修整需要传递磁盘或 SCSI 磁盘,以及与 Trim 兼容的硬件。

虚拟文件

有三种类型的 VHD 文件:

  • 固定文件旨在提高复原能力和性能,如果未主动监控托管卷上的存储值,则应使用这些文件。 在运行时扩展 VHD 文件时,请确保有足够的磁盘空间。 可以在任何磁盘格式上使用这些文件。

  • 动态文件旨在确保复原能力并根据部署的需要分配磁盘空间。 只能在 VHDX 上使用这些文件。

  • 差异文件可使虚拟机快照链保持较短,以确保良好的磁盘 I/O 性能。 可以在任何磁盘格式上使用这些文件。

固定文件类型

创建固定 VHD 文件时,系统会为其分配空间。 固定文件不太可能分为若干片段,在单个 I/O 拆分成多个 I/O 时会降低 I/O 吞吐量。 此外在这三种文件类型中,它的 CPU 开销最低,因为读取和写入操作不需要查找块的映射。

如果需要最佳的复原能力和性能,建议使用固定文件类型。

动态文件类型

创建固定动态 VHD 文件时,系统会为其按需分配空间。 文件中的块最初为已分配的块,文件内没有空间可备份未分配的块。 当某个块收到第一个写入操作时,虚拟化堆栈必须在 VHD 文件中为该块分配空间,然后更新元数据。 这种分配会增加写入操作需要的磁盘 I/O 数,并增大 CPU 使用率。 在元数据中查找块的映射时,对现有块进行读取和写入会产生磁盘访问与 CPU 开销。

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

差异文件类型

差异文件是将写入操作存储到磁盘的虚拟机快照。 如果写入没有现有写入的块,系统将按照与动态扩展的 VHD 相同的方式,在 VHD 文件中分配空间。 如果块已包含写入,则系统服务将从 VHD 文件中读取操作。 否则,系统服务将从父级 VHD 文件为块提供服务。 在这两种情况下,系统都将读取元数据来确定块映射。 对此 VHD 进行读取和写入可能会消耗更多的 CPU,并导致 I/O 用量比使用固定 VHD 文件时更多。

只有少量快照时,存储 I/O 使用的 CPU 量可能会超过正常情况,但除占用大量 I/O 的服务器工作负载外,不会显著影响性能。 创建和使用大型虚拟机快照链会导致性能问题。 在差异文件中,系统需要在多个不同的差异 VHD 中检查请求的块,以便从 VHD 读取。 如果使用差异文件,我们建议保持简短的快照链,以确保良好的磁盘 I/O 性能。

大小注意事项

计划磁盘优化时,应考虑块大小和扇区大小。 本节介绍了有关调整块和扇区大小的建议。

块大小

由于块大小可能会显著影响性能,因此建议块大小应与使用磁盘的工作负载的分配模式相匹配。 如果应用程序以 16 MB 的区块为单位分配块,则最好使用 16 MB 的 VHD 块大小。 只有使用 VHDX 文件格式的 VHD 才能使用大于 2 MB 的块大小。 如果块大小大于随机 I/O 工作负载的分配模式,则会增加 VHD 在主机上使用的空间。

扇区大小

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

这些模拟驱动器具有 4 KB 磁盘扇区原生驱动器的一些优点,例如改进了格式效率和纠错码 (ECC) 方案。 仿真驱动器通过磁盘接口公开 4 KB 扇区大小时面临的兼容性问题较少。

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

使用 512e 磁盘来支持过渡大小

512e 磁盘只能对物理扇区执行 Write 写入操作。 这种类型的磁盘无法直接写入系统向其发出的 512 字节扇区。 磁盘有一个内部进程,需要有该进程才能执行写入操,这涉及到按以下顺序执行读取-修改-写入 (RMW) 操作:

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

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

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

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

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

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

    Diagram of a VHD 4-KB block that's not aligned with the physical 4-KB boundary.

当前分析程序为了更新有效负载数据而执行的每个 4 KB 写入操作都会导致两次读取磁盘上的两个块。 然后,系统会更新这些块并将其写回到这两个磁盘块。 Windows Server 2016 中的 Hyper-V 可缓解 VHD 堆栈上 512e 磁盘上的一些性能影响。 Hyper-V 准备结构以对齐 VHD 格式的 4 KB 边界。 这种缓解措施可以避免在访问虚拟硬盘文件中的数据以及更新虚拟硬盘元数据结构时造成 RMW 影响。

如前所述,从早期版本 Windows Server 复制的 VHD 不会自动进行 4 KB 对齐。 可以通过将“从源复制”磁盘选项与 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 格式。

直通磁盘

由于给虚拟机迁移场景带来的限制原因,建议不要使用传递磁盘。

将虚拟机中的 VHD 直接映射到物理磁盘或逻辑单元号 (LUN),而不是 VHD 文件,这被称为“传递磁盘”。借助传递磁盘,可绕过根分区中的 Windows NT 文件系统,从而减少存储 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 配置需要 I/O 吞吐量方面的可伸缩性。 大型 VM 的一个示例是运行 64 个虚拟处理器的 Microsoft SQL Server。

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

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

  • 更高效的 I/O 完成机制,涉及虚拟处理器之间的中断分布,以避免高开销的处理器间中断。

注册表项

建议使用 Windows Server NUMA 注册表项设置来提高大型虚拟机上运行的工作负载性能。

我们增加并更新了一些注册表项来支持上一节所述的增强功能,并允许调整通道数。 可以在 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) 操作,来确保虚拟机工作负荷可以按照与物理环境中相同的方式使用已启用 ODX 的存储。

针对 VHD 的关键性维护任务(例如合并、移动和压缩)会涉及复制大量数据。 当前复制数据的方法要求系统在不同的位置读取和写入数据,非常耗时,并且会消耗本可以用于为虚拟机提供服务的 CPU 和内存资源。

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

Windows Server 2012 及更高版本中的 Hyper-V 支持 ODX 操作,因此复制的数据可以从来宾 OS 传递到主机硬件。 工作负荷可以按照与非虚拟化环境相同的方式使用启用了 ODX 的存储。 Hyper-V 存储堆栈还可以在 VHD 维护操作期间发出 ODX 操作,例如在海量数据迁移期间合并磁盘和存储迁移元数据操作。

取消映射通知集成

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

VHD 文件位于存储卷上,并与其他文件共享可用空间。 由于其文件大小往往很大,VHD 文件可能会占用大量空间。 对存储空间的需求增加会影响 IT 硬件预算,因此应尽可能优化物理空间使用情况。

在早于 Windows Server 2012 的 Windows Server 版本中,来宾 OS 和 Hyper-V 主机中的 Windows 存储堆栈存在限制,导致无法优化存储空间。 当应用程序删除 VHD 中的内容时,存储空间仍然会被放弃。 系统不会向 VHD 或物理存储设备通知有关已删除的信息,导致 Hyper-V 存储堆栈无法为基于 VHD 的虚拟磁盘文件优化空间。 因此,基础存储设备无法回收被已删除数据占用,并且当前未使用的空间。

在 Windows Server 2012 及更高版本中,Hyper-V 支持“取消映射通知”。 借助此功能,VHDX 文件可以向存储堆栈报告已删除的数据,然后存储堆栈将通过保持文件大小剪裁和回收未使用的存储空间来提高效率。

只有 Hyper-V 特定的 SCSI、启发式 IDE 和虚拟光纤通道控制器允许从来宾 OS 发出 unmap 命令来访问主机虚拟存储堆栈。 在 VHD 上,只有 VHDX 格式的虚拟磁盘才支持从来宾 OS 发出 unmap 命令。