非預設虛擬埠和 VMQ
預設的 NIC 交換器是網路介面卡的元件,可支援單一根目錄 I/O 虛擬化 (SR-IOV) 介面。 交換器一律會將預設虛擬埠 (VPort) 附加至 PCI Express (PCIe) 實體函式 (PF) 。 參數可以將一或多個非預設 VPorts 連結至 PF。 如需詳細資訊,請參閱 建立虛擬埠。
虛擬化堆疊會在 Hyper-V 父資料分割的管理作業系統中執行。 此堆疊會 (OID) 方法要求發出物件識別碼來建立 VPorts OID_NIC_SWITCH_CREATE_VPORT。 不過,堆疊可以建立比使用中 PCIe 虛擬函式數目更多的 VPorts (VFs) ,這些資源是透過 OID_NIC_SWITCH_ALLOCATE_VF的 OID 方法要求所配置。
如果網路介面卡上已啟用 SR-IOV,則必須停用完整的 VMQ 功能。 不過,附加至 PF 且未連結至 VF 的非預設 VPorts 可以提供與虛擬機器佇列相同的功能, (VMQ) 介面。 下列幾點討論 VPorts 如何為類似 VMQ 的封包傳輸提供硬體加速的資料路徑:
VMQ 會透過媒體存取控制 (MAC) 硬體篩選來判斷目標 VM。 這可避免判斷虛擬化堆疊中目標 VM 的額外負荷。
從Windows Server 2012開始,虛擬化堆疊會發出OID_RECEIVE_FILTER_SET_FILTER的 OID 方法要求,在 VPort 上設定接收篩選。 針對此 OID 要求,虛擬化堆疊會傳遞 NDIS_RECEIVE_FILTER_PARAMETERS 結構,指定與虛擬網路介面卡相關聯的 MAC 位址和虛擬 LAN (VLAN) 識別碼。 類似于 VMQ,它可以在 VPort 上設定多個 MAC 位址和 VLAN 識別碼組。 虛擬化堆疊也會指定要設定接收篩選的目標 VPort。
SR-IOV 網路介面卡會根據透過 OID_RECEIVE_FILTER_SET_FILTER 要求指定的篩選準則,執行類似的硬體篩選。 在 VPort 的硬體接收佇列上收到封包時,迷你埠驅動程式會在封包 NET_BUFFER_LIST結構的頻 外 (OOB 中指定來源 VPort 識別碼) 資料。 根據 VPort 識別碼,虛擬化堆疊會決定目標 VM,並指出在 VM 中執行之網路堆疊的封包。
同樣地,虛擬化堆疊會在傳輸封包 之NET_BUFFER_LIST 結構的 OOB 資料中指定目標 VPort 識別碼。 當驅動程式處理封包的傳送要求時,它會將封包放在指定 VPort 的硬體傳輸佇列中。
您可以使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏,從封包的 OOB 資料取得 VPort 識別碼。
如需此程式的詳細資訊,請參閱 透過虛擬埠的封包流程。
如需 SR-IOV 網路介面卡接收篩選需求的詳細資訊,請參閱 判斷接收篩選功能。
VMQ 提供中斷和 DPC 平行存取。
從 NDIS 6.30 和 Windows Server 2012 開始,附加至 PF 的 VPort 可以設定為具有特定的 CPU 親和性。 虛擬化堆疊會使用 OID_NIC_SWITCH_CREATE_VPORT 或 OID_NIC_SWITCH_VPORT_PARAMETERS的 OID 方法要求,設定 VPort 的 CPU 親和性和中斷仲裁參數。 如此一來,虛擬化堆疊會設定類似 VMQ 的中斷型參數,以進行中斷和 DPC 並行。
例如,當 SR-IOV 網路介面卡在設定為具有特定 CPU 親和性的 VPort 上接收封包時,配接器會在指定的 CPU 上產生中斷。 迷你埠驅動程式會指出接收的封包給 NDIS,以及該 CPU 的虛擬化堆疊。
PF 迷你埠驅動程式會在 呼叫 MiniportInitializeEx的內容中公告其 SR-IOV 功能。 驅動程式會使用其功能初始化 NDIS_SRIOV_CAPABILITIES 結構,並呼叫 NdisMSetMiniportAttributes 來註冊其功能。 如需詳細資訊,請參閱 判斷 SR-IOV 功能。
下列 NDIS_NIC_SWITCH_CAPABILITIES 結構成員會影響 VPorts 的配置方式:
MaxNumVPorts,指定可在網路介面卡上建立的 VPort 數目上限。
MaxNumVFs,指定可在網路介面卡上配置的 VFs 數目上限。
從 NDIS 6.30 開始,當迷你埠驅動程式初始化 NDIS_NIC_SWITCH_CAPABILITIES 結構時,它可以在 NicSwitchCapabilities 成員中設定NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL旗標。 此旗標會指定可以從網路介面卡上的 VPort 集區,以非保留的方式建立非預設 VPorts。 這可讓可用的非預設 VPorts 視需要建立並指派給 PF 和配置的 VFs。 如果網路介面卡支援 VMQ 介面,則指派給 PF 的非預設 VPorts 也可用於 VM 接收佇列。
如果已設定NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL旗標,則會建立可用的非預設 VPorts,並指派給 PF 和配置的 VFs。 可以建立並指派給 PF 的 VPort 數目上限,與驅動程式在 MaxNumVPorts 成員中報告的值相同。 迷你埠驅動程式必須保留一個 VPort,才能作為指派給 PF 的預設 VPort。 因此,可以指派給 PF 且用於 VM 接收佇列的非預設 VPort 數目上限會 (MaxNumVPorts – 1) 。
注意
如果設定此旗標,則不會保留非預設 VPorts 的建立和指派給 VF 配置。 因此,如果集區已耗盡可用的 VPort,可能會發生 VF 可能未指派 VPort 的情況。
如果未設定NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL旗標,則會保留非預設 VPorts 的建立和指派給 VF 指派。 可以建立並指派給 PF 並用於 VM 接收佇列的其他非預設 VPort 數目上限為 (MaxNumVPorts–MaxNumVFs) 。
如需 VMQ 的詳細資訊,請參閱 虛擬機器佇列 (VMQ) 。