Sdílet prostřednictvím


Jak fungují akcelerované síťové služby na virtuálních počítačích Linux a FreeBSD

Když se v Azure vytvoří virtuální počítač, vytvoří se syntetické síťové rozhraní pro každou virtuální síťovou kartu v její konfiguraci. Syntetické rozhraní je zařízení VMbus a používá ovladač netvsc. Síťové pakety, které používají toto syntetické rozhraní, procházejí virtuálním přepínačem v hostiteli Azure a do fyzické sítě datacentra.

Pokud je virtuální počítač nakonfigurovaný s akcelerovanými síťovými službami, vytvoří se druhé síťové rozhraní pro každou nakonfigurovanou virtuální síťovou kartu. Druhé rozhraní je virtuální funkce SR-IOV (VF), kterou nabízí síťová karta fyzické sítě v hostiteli Azure. Rozhraní VF se zobrazí v hostu Linuxu jako zařízení PCI. V Linuxu používá ovladač Mellanox mlx4 nebo mlx5, protože hostitelé Azure používají fyzické síťové karty z Mellanoxu.

Většina síťových paketů přechází přímo mezi hostem Linuxu a fyzickým síťovým rozhraním bez procházení virtuálního přepínače nebo jakéhokoli jiného softwaru, který běží na hostiteli. Kvůli přímému přístupu k hardwaru je latence sítě nižší a méně času procesoru se používá ke zpracování síťových paketů ve srovnání se syntetickým rozhraním.

Různí hostitelé Azure používají různé modely fyzické síťové karty Mellanox. Linux automaticky určuje, jestli se má použít ovladač mlx4 nebo mlx5. Infrastruktura Azure řídí umístění virtuálního počítače na hostitele Azure. Bez možnosti zákazníka určit, které fyzické síťové rozhraní používá nasazení virtuálního počítače, musí virtuální počítače obsahovat oba ovladače. Pokud je virtuální počítač zastavený nebo uvolněný a pak se restartuje, může se znovu nasadit na hardware s jiným modelem fyzické síťové karty Mellanox. Proto může použít jiný ovladač Mellanox.

Pokud image virtuálního počítače neobsahuje ovladač fyzické síťové karty Mellanox, budou síťové funkce dál fungovat s nižší rychlostí virtuální síťové karty. Portál, Azure CLI a Azure PowerShell zobrazují funkci akcelerovaných síťových služeb, jak je povoleno.

FreeBSD poskytuje stejnou podporu akcelerovaných síťových služeb jako Linux, když běží v Azure. Zbývající část tohoto článku popisuje Linux a používá příklady Linuxu, ale stejné funkce jsou k dispozici v FreeBSD.

Poznámka:

Tento článek obsahuje odkazy na termín slave (podřízený) , což je termín, který už Microsoft nepoužívá. Když se tento termín odebere ze softwaru, odebereme ho z tohoto článku.

Tmelení

Syntetické síťové rozhraní a rozhraní VF se automaticky spárují a fungují jako jedno rozhraní ve většině aspektů používaných aplikacemi. Ovladač netvsc dělá vazby. V závislosti na distribuci Linuxu můžou pomoct pravidla a skripty udev při pojmenování rozhraní VF a při konfiguraci sítě.

Pokud je virtuální počítač nakonfigurovaný s více virtuálními síťovými kartami, hostitel Azure pro každý z nich poskytuje jedinečné sériové číslo. Umožňuje Linuxu provádět správné párování syntetických rozhraní a rozhraní VF pro každou virtuální síťovou kartu.

Syntetická rozhraní a rozhraní VF mají stejnou adresu MAC. Společně tvoří jednu síťovou kartu z hlediska jiných síťových entit, které vyměňují pakety s virtuálním síťovým adaptérem ve virtuálním počítači. Jiné entity neprobírají žádnou zvláštní akci z důvodu existence syntetického rozhraní i rozhraní VF.

Obě rozhraní jsou viditelná prostřednictvím ifconfig příkazu nebo ip addr příkazu v Linuxu. Tady je příklad ifconfig výstupu:

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

Syntetické rozhraní má vždy název ve formuláři eth\<n\>. V závislosti na distribuci Linuxu může rozhraní VF mít název ve formuláři eth\<n\>. Nebo může mít jiný název ve formě enP\<n\> pravidla udev, které přejmenovává.

Pomocí příkazového řádku prostředí, který zobrazuje ovladač zařízení, který rozhraní používá, můžete určit, jestli je konkrétní rozhraní syntetické rozhraní nebo rozhraní VF:

$ ethtool -i <interface name> | grep driver

Pokud je hv_netvscovladač , jedná se o syntetické rozhraní. Rozhraní VF má název ovladače, který obsahuje "mlx". Rozhraní VF je také identifikovatelné, protože jeho flags pole obsahuje SLAVE. Tento příznak označuje, že je pod kontrolou syntetického rozhraní, které má stejnou adresu MAC.

IP adresy se přiřazují pouze k syntetickému rozhraní. Výstup nebo ifconfig ip addr také ukazuje tento rozdíl.

Využití aplikace

Aplikace by měly pracovat pouze se syntetickým rozhraním, stejně jako v jakémkoli jiném síťovém prostředí. Odchozí síťové pakety se předávají z ovladače netvsc do ovladače VF a pak se přenášejí přes rozhraní VF.

Příchozí pakety se přijímají a zpracovávají v rozhraní VF před předáním do syntetického rozhraní. Výjimky jsou příchozí pakety TCP SYN a pakety všesměrového/vícesměrového vysílání zpracovávané pouze syntetickým rozhraním.

Z výstupu ethtool -S eth\<n\>příkazu můžete ověřit, že pakety proudí přes rozhraní VF. Výstupní řádky, které obsahují vf , ukazují provoz přes rozhraní VF. Příklad:

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

Pokud se tyto čítače zvýší při následném spuštění ethtool příkazu, síťový provoz prochází přes rozhraní VF.

Pomocí příkazu můžete ověřit existenci rozhraní VF jako zařízení lspci PCI. Například na virtuálním počítači 1. generace můžete získat výstup podobný následujícímu výstupu. (Virtuální počítače generace 2 nemají starší zařízení 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)

V tomto příkladu poslední řádek výstupu identifikuje VF z fyzické síťové karty Mellanox ConnectX-4.

Příkaz ethtool -l nebo ethtool -L příkaz (k získání a nastavení počtu přenosových a příjmových front) je výjimkou pokynů pro interakci s rozhraním eth<n> . Tento příkaz můžete použít přímo proti rozhraní VF k řízení počtu front pro rozhraní VF. Počet front pro rozhraní VF je nezávislý na počtu front pro syntetické rozhraní.

Interpretace spouštěcích zpráv

Během spouštění Linux zobrazuje mnoho zpráv souvisejících s inicializací a konfigurací rozhraní VF. Zobrazuje také informace o vazbě s syntetickým rozhraním. Pochopení těchto zpráv může být užitečné při identifikaci problémů v procesu.

Tady je příklad výstupu dmesg příkazu, který je oříznutý jenom na řádky, které jsou relevantní pro rozhraní VF. V závislosti na verzi a distribuci jádra Linuxu ve virtuálním počítači se zprávy můžou mírně lišit, ale celkový tok je stejný.

[    2.327663] hv_vmbus: registering driver hv_netvsc
[    3.918902] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: VF slot 1 added

Ovladač netvsc pro eth0 byl zaregistrován.

[    6.944883] hv_vmbus: registering driver hv_pci

Virtuální ovladač PCI VMbus je zaregistrovaný. Tento ovladač poskytuje základní služby PCI na virtuálním počítači s Linuxem v Azure. Před zjištěním a konfigurací rozhraní VF ho musíte zaregistrovat.

[    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]

Zjistilo se zařízení PCI s uvedeným identifikátorem GUID (přiřazeným hostitelem Azure). Je přiřazeno ID domény PCI (0xcf63 v tomto případě) na základě identifikátoru GUID. ID domény PCI musí být jedinečné pro všechna zařízení PCI dostupná na virtuálním počítači. Tento požadavek na jedinečnost zahrnuje další rozhraní Mellanox VF, GPU, zařízení NVMe a další zařízení, která se můžou na virtuálním počítači vyskytovat.

[    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)

Byl zjištěn nástroj Mellanox VF, který používá ovladač mlx5. Ovladač mlx5 zahájí inicializaci zařízení.

[    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

Odpovídající syntetické rozhraní, které používá ovladač netvsc, zjistil odpovídající VF. Ovladač mlx5 rozpozná, že byl svázán se syntetickým rozhraním.

[    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

Jádro Linuxu původně pojmenoval rozhraní eth1VF . Pravidlo udev ho přejmenoval, aby nedocházelo k nejasnostem s názvy přidělenými syntetickým rozhraním.

[    8.087962] mlx5_core cf63:00:02.0 enP53091s1np0: Link up

Rozhraní Mellanox VF je nyní aktivní a aktivní.

[    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

Tyto zprávy označují, že cesta k datům pro obligovaný pár se přepnula tak, aby používala rozhraní VF. Přibližně o 1,6 sekund později se přepne zpět na syntetické rozhraní. Tyto přepínače mohou během procesu spuštění nastat dvakrát nebo třikrát a jsou normálním chováním při inicializaci konfigurace.

[    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

Konečná zpráva indikuje, že cesta k datům se přepnula na použití rozhraní VF. Očekává se během normálního provozu virtuálního počítače.

Údržba hostitele Azure

Během údržby hostitele Azure může být všechna rozhraní VF dočasně odebrána z virtuálního počítače. Po dokončení údržby se rozhraní VF přidají zpět do virtuálního počítače. Normální operace pokračuje. I když virtuální počítač funguje bez rozhraní VF, síťový provoz pokračuje přes syntetické rozhraní bez přerušení aplikací.

V tomto kontextu může údržba hostitele Azure zahrnovat aktualizaci komponent síťové infrastruktury Azure nebo úplný upgrade softwaru hypervisoru hostitele Azure. K takovým servisním událostem dochází v časových intervalech, které závisí na provozních potřebách infrastruktury Azure. K těmto událostem obvykle dochází v průběhu roku několikrát.

Automatické přepínání mezi rozhraním VF a syntetickým rozhraním zajišťuje, že servisní události neruší úlohy, pokud aplikace interagují pouze se syntetickým rozhraním. Latence a zatížení procesoru můžou být během těchto období vyšší kvůli použití syntetického rozhraní. Doba trvání těchto období je obvykle asi 30 sekund, ale někdy může být delší než několik minut.

Odebrání a čtení rozhraní VF během servisní události je viditelné ve dmesg výstupu virtuálního počítače. Tady je typický výstup:

[   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

Cesta k datům se přepnula z rozhraní VF a rozhraní VF se odregistrovalo. V tomto okamžiku Linux odebral všechny znalosti rozhraní VF a funguje, jako by se akcelerované síťové služby nepovolily.

[   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]

Po dokončení údržby se přečte rozhraní VF, zjistí se nové zařízení PCI se zadaným identifikátorem GUID. Přiřadí se stejné ID domény PCI (0xcf63) jako předtím. Zpracování přečteného rozhraní VF se podobá zpracování během počátečního spuštění.

[   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

Ovladač mlx5 inicializuje rozhraní VF a rozhraní je nyní funkční. Výstup je podobný výstupu během počátečního spuštění.

[   8226.267380] hv_netvsc 000d3af5-76bd-000d-3af5-76bd000d3af5 eth0: Data path switched to VF: enP53091s1np0

Cesta k datům se přepnula zpět do rozhraní VF.

Zakázání nebo povolení akcelerovaných síťových služeb na nerušovaném virtuálním počítači

Akcelerované síťové služby můžete zakázat nebo povolit na virtuální síťové kartě v nerušovaném virtuálním počítači pomocí Azure CLI. Příklad:

$ az network nic update --name u1804895 --resource-group testrg --accelerated-network false

Zakázání akcelerovaných síťových služeb, které jsou povolené na hostovaném virtuálním počítači, vytvoří dmesg výstup. Je to stejné jako při odebrání rozhraní VF pro údržbu hostitele Azure. Povolení akcelerovaných síťových služeb vytvoří stejný dmesg výstup jako při čtení rozhraní VF po údržbě hostitele Azure.

Tyto příkazy Azure CLI můžete použít k simulaci údržby hostitele Azure. Pak můžete ověřit, že vaše aplikace nejsou nesprávně závislé na přímé interakci s rozhraním VF.

Další kroky