vSphere VMDirectPath I/O 和动态 DirectPath I/O:平台和设备要求 (2142307)

Last Updated: 2020/4/8Categories: InformationalTotal Views: 1073Language:                 Chinese (Simplified)JapaneseEnglish                          subscribe

https://kb.vmware.com/s/article/2142307?lang=zh_cn

免责声明:本文为 vSphere VMDirectPath I/O and Dynamic DirectPath I/O: Requirements for Platforms and Devices 的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。

 Purpose


本文列出硬件平台和 PCI 设备的要求和建议,以使它们适用于 vSphere VMDirectPath I/O 和动态 DirectPath I/O。

 Resolution

关于 VMDirectPath I/O

VMDirectPath I/O(PCI 直通)支持将硬件 PCI 功能直接分配给虚拟机。这使虚拟机能够访问 PCI Function 并尽可能减少来自 ESXi 主机的干预,从而可能提升性能。它适用于性能关键的工作负载,如 VMware View vDGA 等虚拟桌面图形加速以及企业级电信设备中的高数据速率网络。由于可以将设备中的每个虚拟功能分配给单独的虚拟机,因此特别适合支持 SR-IOV 技术的 PCI 设备。

 

虽然 VMDirectPath I/O 可以提高虚拟机的性能,但启用后会导致虚拟机无法使用 vSphere 的几个重要功能,如挂起和恢复、快照、Fault Tolerance 和 vMotion。有关详细信息,请参见 VMware Documentation

 

如何使用此文档

  • 服务器平台 OEM:确保您的平台符合“VMDirectPath I/O 平台要求和建议”部分列出的要求,并且该平台在 VMware Compatibility Guide 中列为兼容平台。
  • 设备 I/O 供应商:确保设备符合“设备要求和建议”部分列出的标准。
  • 客户:如果您正在 VMDirectPath 模式下部署设备,确保设备供应商文档确认支持此处列出的要求,并在 VMware Compatibility Guide 中列出此设备。
  • 用户:如果要将 PCI 直通设备添加到虚拟机,请确保该虚拟机中运行的客户机操作系统与 VMware Compatibility Guide 中列出的客户机操作系统兼容。请注意,启用了 VBS 的 Windows 虚拟机不支持 VMDirectPath I/O


VMDirectPath I/O 平台要求和建议

IOMMU

该平台必须提供 IOMMU,供 DMA 重映射任何要为 VMDirectPath I/O 分配的 PCI Function。IOMMU 的 DMA 重映射功能是 VMDirectPath I/O 发挥作用的必要条件。直通 PCI Function 发送的 DMA 事务带有客户机操作系统物理地址,必须由 IOMMU 转换成主机物理地址。


PCI Express 访问控制服务 (ACS)

直通 PCI 功能发出的 DMA 请求带有客户机操作系统物理地址,而非主机操作系统物理地址,因此在缺少 ACS 的情况下,无法在主机的 PCI 总线层次结构中正确地传送这些请求。借助 ACS,这些请求会无条件地传送到平台的 IOMMU 进行地址转换。

 

PCIe root 端口和 PCIe 交换机下游端口需要 ACS 支持,这些端口位于 PCI 总线层次结构中直通 PCI Function 的上方。如果直通 PCI Function 是多功能设备的一部分并支持对等传输,则同样需要 ACS。


设备要求和建议

PCI Function BAR

主机物理地址空间中的 PCI Function BAR 必须与 4 KB 地址保持一致或是它的倍数(例如:8 KB、16 KB 等)。如果 PCI Function 的 BAR 大于或等于 4 KB,无疑满足这一要求。

 

如果 PCI Function 的 BAR 小于 4 KB,平台固件必须与上述 BAR 起始值保持一致,并且必须确保在映射 BAR 的 4 KB 页面中未映射其他系统资源。

 

不同产品版本的 PCI Function BAR 大小要求:

 

ESXi 5.1 和 5.5

  • 一个 PCI BAR 支持的最大大小为 1 GB。
  • PCI Function 中所有 BAR 的总大小不得超过 3.75 GB。
  • 虚拟机中其它 PCI 设备占用的 BAR 空间量将进一步限制此值,因为虚拟机中所有 PCI BAR 的总大小将变成 3.75 GB 或更小。对于 ESXi 5.1 和 5.5,使用旧版 BIOS 固件映射低于 4 GB 地址边界的 BAR 的虚拟机将根据 BAR 对齐要求和 BIOS 内存预留提高这些要求。

ESXi 6.0

  • 如果虚拟机使用旧版 BIOS 模式,则为 ESXi 6.0 设定的限制与 ESXi 5.5 中的限制相同。
  • 要在虚拟机中使用总分配量超过 3.75 GB 的 BAR,请将以下行添加到虚拟机的 vmx 文件,以将虚拟机 BIOS 设置为使用 UEFI:

    firmware=“efi"
     
  • 要启用 64 位内存映射 I/O (MMIO),请将以下行添加到虚拟机 vmx 文件:

    pciPassthru.use64bitMMIO="TRUE"
     
  • 在 ESXi 6.0 Patch 4 和更高版本中,可以使用超过 32 GB 的容量,方法是在虚拟机的 vmx 文件中将 MMIO 区域的大小指定为 2 的幂数倍 GB:

    例如:

    pciPassthru.64bitMMIOSizeGB = “128"

 

  • 将 ESXi 主机 BIOS 设置为支持 4 GB 以上和 16 TB 以下的 PCI 映射。
  • 在 UEFI BIOS 模式中,虚拟机的 BAR 总分配量限制为 32 GB。

 

ESXi 6.5

  • 如果虚拟机使用旧版 BIOS 模式,则为 ESXi 6.5 设定的限制与 ESXi 6.0 中的限制相同。
  • 如果虚拟机使用 UEFI BIOS 模式,将应用 ESXi 6.0 限制(除非已移除 32 GB 限制),并且虚拟机的新 BAR 总分配量限制也基于此硬件限制。此限制通常为 1 TB 或更多。

    通过在 .vmx 文件中查看以下条目,确保虚拟机使用的是 UEFI BIOS:

    firmware=“efi"
     
  • 要启用 64 位内存映射 I/O (MMIO),请将以下行添加到虚拟机 vmx 文件:

    pciPassthru.use64bitMMIO="TRUE"
     
  • 要使用超过 32 GB 的容量,请在虚拟机的 vmx 文件中将 MMIO 区域的大小指定为 2 的幂数倍个 GB:

    例如:

    pciPassthru.64bitMMIOSizeGB = “128"


PCI Function 重置

为了隔离 ESXi 主机与虚拟机,ESXi 将重置为 VMDirectPath I/O 分配的 PCI Function。这样做是为了确保客户机操作系统在开机或重新引导时看到空白状态的设备。
 

ESXi 支持为 PCI Function 使用多个重置类型:

  • 功能级重置 (FLR)
  • 二级总线重置
  • 链路禁用/启用
  • 设备电源状态转换(D0 > D3hot > D0;非标准重置方法)

选定的方法可通过 ESXi 主机中位于 /etc/vmware/passthru.map 的 passthru.map 文件进行配置。

 

FLR 和设备电源状态转换重置类型具有功能级粒度,即可以对单个 PCI Function 应用重置,而不会影响该设备或同一总线的其他设备中的其它 PCI Function。

 

相反,二级总线重置和链路禁用/启用具有总线级粒度,即重置会影响同一总线上的所有 PCI Function(例如,多功能 PCIe 设备中的所有 PCI Function)。

 

要求和建议

  1. 为了确保对 ESXi 主机与虚拟机进行隔离,PCI Function 必须在 PCI 重置后满足以下标准。PCIe 3.0 规范的第 6.6.2 部分提供这些标准:
    • Function 不得显示为主机或其外部接口中的初始化适配器(例如,Function 必须处于静默状态且不发出任何事务或中断)。
    • Function 不得保留软件可读状态,该状态可能包括与任何以前使用的功能相关的机密信息。
    • Function 应采用能够为驱动程序所用的标准配置 。
  2. VMware 强烈建议 PCI Function 支持功能级重置 (FLR)。
  3. 对于总线级粒度的重置方法,仅当同一总线上的所有 PCI Function 被集中分配到同一虚拟机时,VMDirectPath I/O 才受支持。
    • 向虚拟机分配为 VMDirectPath I/O 指定的 PCI Function 时,ESXi 5.5 和 6.0 会自动检测重置依赖关系并通知用户。
    • ESXi 5.1 不会自动检测重置依赖关系。这些依赖关系必须由用户通过 passthru.map 文件并将 PCI 功能的 shareable 属性设置为 false 来明确配置。
  4. 位于 PCI Host Bridge 正下方的 PCI Function 必须支持 FLR 或 D3Hot 重置,以便符合 VMDirectPath I/O 要求。


多功能 PCI 设备

强烈建议多功能 PCI 设备的 PCI Function 之间不存在功能依赖关系。

 

如果多功能设备的 PCI Function 之间存在功能依赖关系,必须将同一设备中所有相关的 PCI Function 集中分配至同一虚拟机的 VMDirectPath I/O。此类依赖关系必须由用户通过 passthru.map 文件并将相关 PCI 功能的可共享属性设置为 false 来明确配置。

 

对等 DMA 事务

ESXi 目前不支持 PCI 直通设备在虚拟机中接收/发送对等 DMA 事务。也就是说,ESXi 希望直通 PCI 设备发出的所有 DMA 事务都能访问虚拟机的内存(例如,RAM)且从不访问虚拟机中另一个 PCI 设备的内存映射 BAR(无论其他 PCI 设备是虚拟设备还是另一个直通设备)。同样,虚拟机中的虚拟 PCI 设备发出的 DMA 事务不得访问分配给虚拟机的 PCI 直通设备的内存映射 BAR。如果无法满足此要求,可能会在发生对等事务时导致虚拟机终止。

 

PCI Function 位于旧版 PCI 网桥后

VMware 强烈建议将为 VMDirectPath I/O 分配的 PCI Function 放置在 PCI Express root 端口或交换机下游端口的后面。

 

VMware 不建议将为 VMDirectPath I/O 分配的 PCI Function 放置在常规 PCI 网桥或 PCIe 到 PCI/PCI-X 网桥的后面。位于 PCIe 到 PCI/PCI-X 网桥或常规 PCI 网桥后面的 PCI Function 必须集中分配给同一虚拟机的 VMDirectPath I/O。

 

这些网桥通过为其后 PCI Function 发出的 PCI 事务提供网桥的 PCI 请求者 ID 来取得这些事务的控制权。因此 ESXi 主机必须使用 PCI 网桥的请求者 ID 来编程 IOMMU 转换,这意味着放在网桥后面的所有 PCI Function 必须放置在同一 IOMMU 域中,从而将 PCI Function 集中分配到同一虚拟机。

 

PCI 根复合体集成端点

根复合体端点(即,位于 PCI 主桥正下方的 PCI 功能)的 PCI 直通适用于常规(非 SR-IOV)PCI 功能。它当前不适用于 SR-IOV 虚拟功能。

 

PCI SR-IOV 设备

只要符合本文中规定的 PCI 平台和设备要求,就支持 SR-IOV 虚拟功能的 PCI 直通。

当前不支持将 SR-IOV 物理功能的 PCI 直通用于使客户机操作系统能够启用 VF。具体来说,ESXi 当前不支持将 PF 的 SR-IOV 能力虚拟化到客户机操作系统。
 

只要符合本文中规定的 PCI 平台和设备要求,就允许将 SR-IOV 物理功能的 PCI 直通用于其他目的。

 

通过 DMA 访问主机预留内存的 PCI Function

VMware 强烈建议为 VMDirectPath I/O 分配的 PCI Function 不会生成对在平台的内存映射中标记为预留的 ESXi 主机内存的 DMA 读/写访问权限(例如,BIOS E820 或 UEFI GetMemoryMap())。

 

生成对主机预留内存的 DMA 读\写访问权限的 PCI Function 会强制 ESXi 主机为预留的内存范围创建 IOMMU 身份映射(因为此类 DMA 带有主机物理地址,而非客户机物理地址)。如下所述,这会制约 ESXi 主机和虚拟机的寻址功能。

 

如果 PCI Function 通过 DMA 访问 ESXi 主机预留内存,PCI Function 及其通过 DMA 访问的预留范围必须显示在 ACPI 预留内存区域报告结构 (RMRR) 中。

在不同的产品版本中,ESXi 为通过 DMA 访问主机预留内存的 PCI 功能的 VMDirectPath I/O 提供的支持各不相同:

 

ESXi 5.1

通过 DMA 访问主机预留内存的 PCI 功能的 VMDirectPath I/O 不受支持,除非 PCI 功能重置使 PCI 功能停止对此类内存进行 DMA 访问。

 

ESXi 5.5(ESX 5.5U3 之前的版本)

 

在以下条件下,支持通过 DMA 访问主机预留内存的 PCI Function 的 VMDirectPath I/O:

  1. 与 PCI Function 相关的 RMRR 区域必须按优先顺序放置在下列某个范围内:
    1. 虚拟机的物理内存范围外(即在为虚拟机的 RAM 配置的最高地址的上方)。
    2. 低于 4 GB 地址边界,在虚拟机的 PCI 内存保留区中。
      必须配置虚拟机的 .vmx 文件来映射虚拟机的 PCI 内存保留区,以覆盖 RMRR 区域(通过设置配置选项“pciHole.start”和“pciHole.size”)。

      PCI 内存保留区必须介于 256 MB -> 4 GB 的地址范围内。

      说明:RMRR 范围不得与虚拟机的物理内存范围重叠(上述情况除外),否则 ESXi 将无法正确地编程 IOMMU 地址转换。
  2. ESXi 将重置为 VMDirectPath I/O 分配的 PCI 功能。如果只有借助通过 DMA 访问 RMRR 区域的 PCI Function,平台才能正常运行,则必须确保 PCI Function 在使用特定于平台的机制重置后继续通过 DMA 访问 RMRR 区域。如果无法实现,则不应为 VMDirectPath I/O 分配 PCI Function。

 

ESXi 5.5(从 5.5U3 开始)和 ESXi 6.x

 

从 ESXi 5.5 U3 开始,ESXi 将自动调整虚拟机的物理内存映射,以防止主机 RMRR 区域与虚拟机的 RAM 之间产生重叠。但是,只有满足以下条件时才会进行自动调整。

 

  1. 与 PCI Function 相关的 RMRR 区域必须位于下列某个范围内:
    1. 虚拟机的物理内存范围外(即在为虚拟机的 RAM 配置的最高地址的上方)。
    2. 低于 4 GB 地址边界,介于 256 MB -> 4 GB 的范围内。
    3. 在虚拟机的 BIOS 预留内存范围内(即 640 K-1 MB)。
  2. ESXi 将重置为 VMDirectPath I/O 分配的 PCI 功能。如果只有借助通过 DMA 访问 RMRR 区域的 PCI Function,平台才能正常运行,则必须确保 PCI Function 在使用特定于平台的机制重置后继续通过 DMA 访问 RMRR 区域。如果无法实现,则不应为 VMDirectPath I/O 分配 PCI Function。


ESXi 7.0

ESXi 7.0 将使用与 ESXi 5.5U3 和更高版本相同的算法自动调整虚拟机的物理内存映射,以防止主机 RMRR 区域与虚拟机的 RAM 之间产生重叠。但是,在使用动态 DirectPath I/O(从 ESXi 7.0 开始可用)时,用户可以指定多个有效的供应商/设备组合,并允许 ESXi 根据虚拟机打开电源时可用的设备来选择特定设备。ESXi 将尝试自动调整虚拟机的物理内存映射以容纳所有允许的设备,但并非始终可以容纳,具体取决于设备将其 RMRR 放置到的位置。如果自动调整无法容纳选定的设备,vmware.log 文件将显示以下错误:

2019-10-09T17:21:14.247Z| vmx| I125: PCIPassthru: Failed to register device 0000:21:00.0 error = 0x1c
2019-10-09T17:21:14.247Z| vmx| I125: Msg_Post: Error
2019-10-09T17:21:14.247Z| vmx| I125: [msg.pciPassthru.createAdapterFailedDeviceOverlap] Device 033:00.0 has an overlapping memory region with the virtual machine's memory.
2019-10-09T17:21:14.247Z| vmx| I125: ----------------------------------------


注意:上述日志摘录仅为示例。日期、时间和环境变量可能因环境而异。

在这种情况下,用户可能需要将其选择减少至单个供应商/设备组合,或者减少至虚拟机的内存保留区能够容纳所有 RMRR 区域的一部分组合。请注意,如果不满足自动调整算法的条件,也会发生上述错误。


PCI 中断

VMDirectPath I/O 支持使用 MSI-X、MSI 或旧版(即 INTx)PCI 中断的 PCI Function。VMware 建议用于 VMDirectPath I/O 的 PCI Function 支持 MSI 或者 MSI-X 中断。

 

说明:使用 INTx 的 PCI Function 可以与系统中其它 PCI Function 共享中断线。这可以为共享中断的每个 PCI Function 延迟中断维护。如果为 VMDirectPath I/O 分配了一个或多个共享 INTx 的 PCI Function,延迟时间将进一步延长。


PCI 错误

ESXi 不支持虚拟化 VMDirectPath I/O 的 PCI 错误(即为 VMDirectPath I/O 分配的 PCI 功能报告的 PCI 错误始终由 ESXi 处理,从不提供至客户机操作系统)。
 

由于当前版本的服务器存在平台限制,因此无法更正的 PCI 错误通常导致 NMI 传递到 ESXi 目前无法从其恢复的处理器。因此,VMware 要求将为 VMDirectPath I/O 分配的 PCI 功能设计为在正常工作条件下不会发出无法更正的 PCI 错误。


带扩展 ROM 的 PCI 功能

ESXi 支持带扩展 ROM 的 PCI 功能的 VMDirectPath I/O(例如,扩展 ROM 代码可能包含特定于设备的初始化功能和/或用于从直通 PCI 功能引导虚拟机的代码)。

 

只要虚拟机开机或重新启动,即由虚拟机的固件执行扩展 ROM。设备热重置应使设备处于可重新执行扩展 ROM 的状态。

默认情况下禁止虚拟机固件执行扩展 ROM 代码,但在以下情况下可以启用此功能:

  1. 设置 ESXi 引导选项“pcipSaveOPROM=TRUE”。
  2. 为虚拟机的 .vmx 文件配置参数“%s.opromEnabled=TRUE”(例如,pciPassthru0.opromEnabled=TRUE)。

    未来实施说明:ESXi 的未来版本可能会支持在运行时(即无需关闭 ESXi 主机电源)将为 VMDirectPath I/O 分配的 PCI 功能重新分配回 ESXi VMkernel(虽然目前不支持)。对于带扩展 ROM 的 PCI 功能,不支持此操作,因为 PCI 功能会在重新分配期间重置,ESXi 也不会执行扩展 ROM 代码(即此类代码只能由主机的 BIOS/UEFI 固件在引导期间执行)。


PCI 电源管理

ESXi 不支持虚拟化 VMDirectPath I/O 的 PCI 电源管理事件 (PME)(即 VMDirectPath I/O PCI 功能生成的 PME 消息目前会被 ESXi 忽略,不会通知客户机操作系统)。
 

但在默认情况下,虚拟机的 BIOS 确实会将 PCIe 本机电源管理事件的控制权授予通过 APCI _OSC 方法提出此请求的客户机操作系统。这可能会导致客户机操作系统在直通 PCI Function 中启用 PME,从而导致 PCI Function 发生故障,需要生成 PME 才能恢复正常运行(例如 PCI 网卡,在低流量期间,驱动程序会使其处于低功耗状态,此时驱动程序需要生成 PME 的网卡才能恢复正常功耗状态)。
 

可以通过将虚拟机的 BIOS 配置为不向客户机操作系统授予 PCIe 本机电源管理事件控制权来防止发生这种情况。此操作通过重写 _OSC Control Field, Return Value 的 .vmx 配置选项“acpi.osc.pcie”来完成。有关 _OSC Control Field, Return Value 的格式,请参见 ACPI 规范。


常规测试建议

为了提高 VMDirectPath I/O 实施的成功率和整个系统的稳定性,VMware 强烈建议 OEM 合作伙伴对要使用 VMDirectPath I/O 的特定平台执行严格的测试,确保符合本文规定的要求。
 

此测试应考虑虚拟机内常见的开机、重新启动和功能测试用例,但也必须考虑更多问题测试,以尽可能对平台进行充分验证。这些问题主要包括虚拟机强制关机(或崩溃),或者虚拟机正在运行时 ESXi 主机自身强制关机。

 Related Information

有关平台要求,请参见 VMware compatibility guide 并在“功能”下选择“VMDirectPath I/O”。

标签
菜单分类