加速網路在 Linux 和 FreeBSD VM 中的運作方式
在 Azure 中建立虛擬機器 (VM) 時,系統會為其設定中的每個虛擬 NIC 建立綜合網路介面。 綜合介面是 VMbus 裝置,並使用 netvsc 驅動程式。 使用此綜合介面的網路封包會透過 Azure 主機中的虛擬交換器流動,前往資料中心的實體網路。
如果 VM 已設定為使用加速網路,則系統會為每個已設定的虛擬 NIC 建立第二個網路介面。 第二個介面是 Azure 主機中實體網路 NIC 所提供的 SR-IOV 虛擬功能 (VF)。 VF 介面會在 Linux 客體中顯示為 PCI 裝置。 它會使用 Linux 中的 Mellanox mlx4 或 mlx5 驅動程式,因為 Azure 主機會使用來自 Mellanox 的實體 NIC。
多數網路封包會直接在 Linux 客體與實體 NIC 之間移動,而不需要周遊虛擬交換器或任何其他在主機上執行的軟體。 由於直接存取硬體,因此相較於綜合介面,網路延遲較低且 CPU 時間較少,可用來處理網路封包。
不同的 Azure 主機會使用不同的 Mellanox 實體 NIC 模型。 Linux 會自動判斷是否要使用 mlx4 或 mlx5 驅動程式。 Azure 基礎結構會控制 VM 在 Azure 主機上的放置方式。 如果沒有客戶選項可指定 VM 部署所使用的實體 NIC,VM 必須包含這兩個驅動程式。 如果 VM 已停止或解除配置,然後重新啟動,則其可能會在具有不同 Mellanox 實體 NIC 型號的硬體上重新部署。 因此,其可能會使用其他 Mellanox 驅動程式。
如果 VM 映像不包含 Mellanox 實體 NIC 的驅動程式,網路功能會以虛擬 NIC 的較慢速度繼續運作。 入口網站、Azure CLI 和 Azure PowerShell 會將加速網路功能顯示為 [已啟用]。
FreeBSD 在 Azure 中執行時,提供與 Linux 相同的加速網路支援。 本文的剩餘部分說明 Linux 並使用 Linux 範例,但在 FreeBSD 中提供相同的功能。
注意
本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。
繫結
綜合網路介面和 VF 介面會自動配對,並作為應用程式所使用多數層面中的單一介面。 netvsc 驅動程式會執行繫結。 視 Linux 發行版本而定,udev 規則和指令碼可能有助於命名 VF 介面和設定網路。
如果 VM 設定為使用多個虛擬 NIC,則 Azure 主機會為每個 VM 提供唯一的序號。 其會允許 Linux 為每個虛擬 NIC 正確配對綜合和 VF 介面。
綜合和 VF 介面有相同的 MAC 位址。 這些介面一起構成單一 NIC,從其他網路實體的觀點來看,這會與 VM 中的虛擬 NIC 交換封包。 其他實體不會採取任何特殊動作,因為綜合介面和 VF 介面都存在。
這兩個介面都是透過 Linux 中的 ifconfig
或 ip addr
命令來顯示。 以下為範例 ifconfig
輸出:
U1804:~$ ifconfig
enP53091s1np0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0d:3a:f5:76:bd txqueuelen 1000 (Ethernet)
RX packets 365849 bytes 413711297 (413.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9447684 bytes 2206536829 (2.2 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.19.4 netmask 255.255.255.0 broadcast 10.1.19.255
inet6 fe80::20d:3aff:fef5:76bd prefixlen 64 scopeid 0x20<link>
ether 00:0d:3a:f5:76:bd txqueuelen 1000 (Ethernet)
RX packets 8714212 bytes 4954919874 (4.9 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9103233 bytes 2183731687 (2.1 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
綜合介面一律具有格式 eth\<n\>
的名稱。 視 Linux 發行版本而定,VF 介面可能會有格式為 eth\<n\>
的名稱。 或者,因為有一個會重新命名的 udev 規則,它可能會有格式為 enP\<n\>
的不同名稱。
您可以判斷特定介面是綜合介面還是 VF 介面,方法是使用顯示介面所使用裝置驅動程式的殼層命令列:
$ ethtool -i <interface name> | grep driver
如果驅動程式為 hv_netvsc
,則為綜合介面。 VF 介面具有包含 "mlx" 的驅動程式名稱。VF 介面也可供識別,因為其 flags
欄位包含 SLAVE
。 此旗標表示其在具有相同 MAC 位址的綜合介面控制下。
IP 位址只會指派給綜合介面。 ifconfig
或 ip addr
的輸出也會顯示此差異。
應用程式使用情況
應用程式應該只與綜合介面互動,就像任何其他網路環境一樣。 傳出網路封包會從 netvsc 驅動程式傳遞至 VF 驅動程式,然後透過 VF 介面傳輸。
傳入封包會在傳遞至綜合介面之前,先在 VF 介面上接收和處理。 例外狀況是只由綜合介面處理的傳入 TCP SYN 封包和廣播/多點傳送封包。
您可以從 ethtool -S eth\<n\>
的輸出,驗證封包是否流經 VF 介面。 包含 vf
的輸出行會顯示透過 VF 介面的流量。 例如:
U1804:~# ethtool -S eth0 | grep ' vf_'
vf_rx_packets: 111180
vf_rx_bytes: 395460237
vf_tx_packets: 9107646
vf_tx_bytes: 2184786508
vf_tx_dropped: 0
如果這些計數器在連續執行 ethtool
命令時遞增,則網路流量會流經 VF 介面。
您可以使用 lspci
命令,驗證是否存在 VF 介面做為 PCI 裝置。 例如,在第 1 代 VM 上,您可能會取得類似下列輸出的輸出。 (第 2 代 VM 沒有舊版 PCI 裝置。)
U1804:~# lspci
0000:00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) (rev 03)
0000:00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 01)
0000:00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
0000:00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
0000:00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual VGA
cf63:00:02.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx Virtual Function] (rev 80)
在此範例中,最後一行輸出會從 Mellanox ConnectX-4 實體 NIC 識別 VF。
ethtool -l
或 ethtool -L
命令 (用來取得和設定傳輸和接收佇列的數目) 是與 eth<n>
介面互動的指導例外狀況。 您可以對 VF 介面直接使用此命令,以控制 VF 介面的佇列數目。 VF 介面的佇列數目與綜合介面的佇列數目無關。
解譯啟動訊息
在啟動期間,Linux 會顯示許多與 VF 介面初始化和設定相關的訊息。 它也會顯示與綜合介面繫結的相關資訊。 瞭解這些訊息有助於識別流程中的任何問題。
以下是 dmesg
命令的範例輸出,修剪至只有與 VF 介面相關的行。 視 VM 中的 Linux 核心版本和發行版本而定,訊息可能會略有不同,但整體流程相同。
[ 2.327663] hv_vmbus: registering driver hv_netvsc
[ 3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
eth0
的 netvsc 驅動程式已註冊。
[ 6.944883] hv_vmbus: registering driver hv_pci
VMbus 虛擬 PCI 驅動程式已註冊。 此驅動程式會在 Azure 的 Linux VM 中提供核心 PCI 服務。 您必須先註冊它,才能偵測並設定 VF 介面。
[ 6.945132] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[ 6.947953] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[ 6.947955] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[ 6.948805] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[ 6.957487] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[ 7.035464] pci cf63:00:02.0: enabling Extended Tags
[ 7.040811] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[ 7.041264] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]
偵測到具有列出 GUID (Azure 主機指派的) 的 PCI 裝置。 其會根據 GUID 指派 PCI 網域識別碼 (在此案例中為 0xcf63)。 在 VM 中所有可用的 PCI 裝置上,PCI 網域識別碼必須是唯一的。 此唯一性需求跨越其他可能存在於 VM 中的 Mellanox VF 介面、GPU、NVMe 裝置和其他裝置。
[ 7.128515] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[ 7.139925] mlx5_core cf63:00:02.0: handle_hca_cap:524:(pid 12): log_max_qp value in current profile is 18, changing it to HCA capability limit (12)
[ 7.342391] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
偵測到使用 mlx5 驅動程式的 Mellanox VF。 mlx5 驅動程式會開始裝置的初始化。
[ 7.465085] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[ 7.465119] mlx5_core cf63:00:02.0 eth1: joined to eth0
使用 netvsc 驅動程式的對應綜合介面偵測到相符的 VF。 mlx5 驅動程式可辨識其已與綜合介面繫結。
[ 7.466064] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 7.480575] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 7.480651] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
Linux 核心一開始會命名 VF 介面 eth1
。 udev 規則已將其重新命名,以避免與提供給綜合介面的名稱混淆。
[ 8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
Mellanox VF 介面現在已啟動且作用中。
[ 8.090127] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[ 9.654979] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
這些訊息指出已繫結配對的資料路徑已切換為使用 VF 介面。 大約 1.6 秒之後,便會切換回綜合介面。 此類切換可能會在啟動程序期間發生兩次或三次,且在設定初始化時屬於正常行為。
[ 9.909128] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[ 9.910595] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
[ 11.411194] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[ 11.532147] mlx5_core cf63:00:02.0 enP53091s1np0: Disabling LRO, not supported in legacy RQ
[ 11.731892] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
[ 11.733216] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
最後一則訊息表示資料路徑已切換為使用 VF 介面。 在 VM 的正常作業期間,這是預期的結果。
Azure 主機服務
在 Azure 主機服務期間,可能會暫時從 VM 移除所有 VF 介面。 當服務完成時,VF 介面會新增回 VM。 一般作業會繼續進行。 雖然 VM 在沒有 VF 介面的情況下運作,但網路流量會繼續流經綜合介面,而不會中斷應用程式。
在此內容中,Azure 主機服務可能包括更新 Azure 網路基礎結構的元件,或 Azure 主機 Hypervisor 軟體的完整升級。 此類服務事件會根據 Azure 基礎結構的作業需求,以時間間隔發生。 這些事件通常會在一年內發生多次。
如果應用程式只會與綜合介面互動,VF 介面與綜合介面之間的自動切換可確保此類服務事件不會干擾工作負載。 由於使用綜合介面,延遲和 CPU 負載在這些期間可能會較高。 此類期間的持續時間通常大約 30 秒,但有時可能會延長至幾分鐘。
服務事件期間 VF 介面的移除和重新新增會顯示在 VM 的 dmesg
輸出中。 以下是一般輸出:
[ 8160.911509] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched from VF: enP53091s1np0
[ 8160.912120] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF unregistering: enP53091s1np0
[ 8162.020138] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 removed
資料路徑已從 VF 介面切換,且 VF 介面已取消註冊。 此時,Linux 已移除 VF 介面的所有認識,且運作方式就像從未啟用加速網路一樣。
[ 8225.557263] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added
[ 8225.557867] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI VMBus probing: Using version 0x10002
[ 8225.566794] hv_pci e9ac9b28-cf63-4466-9ae3-4b849c3ee03b: PCI host bridge to bus cf63:00
[ 8225.566797] pci_bus cf63:00: root bus resource [mem 0xfe0000000-0xfe00fffff window]
[ 8225.571556] pci cf63:00:02.0: [15b3:1016] type 00 class 0x020000
[ 8225.584903] pci cf63:00:02.0: reg 0x10: [mem 0xfe0000000-0xfe00fffff 64bit pref]
[ 8225.662860] pci cf63:00:02.0: enabling Extended Tags
[ 8225.667831] pci cf63:00:02.0: 0.000 Gb/s available PCIe bandwidth, limited by Unknown x0 link at cf63:00:02.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
[ 8225.667978] pci cf63:00:02.0: BAR 0: assigned [mem 0xfe0000000-0xfe00fffff 64bit pref]
在服務完成後重新新增 VF 介面時,偵測到具有指定 GUID 的新 PCI 裝置。 其指派的 PCI 網域識別碼 (0xcf63) 與之前相同。 重新新增 VF 介面的處理就像在初始啟動期間的處理。
[ 8225.679672] mlx5_core cf63:00:02.0: firmware version: 14.25.8362
[ 8225.888476] mlx5_core cf63:00:02.0: MLX5E: StrdRq(0) RqSz(1024) StrdSz(256) RxCqeCmprss(0)
[ 8226.021016] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF registering: eth1
[ 8226.021058] mlx5_core cf63:00:02.0 eth1: joined to eth0
[ 8226.021968] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 8226.026631] mlx5_core cf63:00:02.0 eth1: Disabling LRO, not supported in legacy RQ
[ 8226.026699] mlx5_core cf63:00:02.0 enP53091s1np0: renamed from eth1
[ 8226.265256] mlx5_core cf63:00:02.0 enP53091s1np0: Link up
mlx5 驅動程式會初始化 VF 介面,而該介面現在可正常運作。 輸出類似於初始啟動期間的輸出。
[ 8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0
資料路徑已切換回 VF 介面。
在非執行 VM 中停用或啟用加速網路
您可以使用 Azure CLI,在非執行 VM 中的虛擬 NIC 上停用或啟用加速網路。 例如:
$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false
停用客體 VM 中啟用的加速網路會產生 dmesg
輸出。 這與針對 Azure 主機服務移除 VF 介面時相同。 啟用加速網路會產生與 Azure 主機開始提供服務之後重新新增 VF 介面時相同的 dmesg
輸出。
您可以使用這些 Azure CLI 命令來模擬 Azure 主機服務。 然後您可以驗證應用程式並未不正確地相依於與 VF 介面的直接互動。
下一步
- 了解如何在 PowerShell 中建立具有加速網路的 VM。
- 了解如何使用 Azure CLI 來建立具有加速網路的 VM。
- 使用 Azure 鄰近放置群組來改善延遲。