Så här fungerar accelererat nätverk i virtuella Linux- och FreeBSD-datorer

När en virtuell dator skapas i Azure skapas ett syntetiskt nätverksgränssnitt för varje virtuellt nätverkskort i konfigurationen. Det syntetiska gränssnittet är en VMbus-enhet och använder netvsc-drivrutinen. Nätverkspaket som använder det här syntetiska gränssnittet flödar via den virtuella växeln i Azure-värden och till datacentrets fysiska nätverk.

Om den virtuella datorn har konfigurerats med accelererat nätverk skapas ett andra nätverksgränssnitt för varje virtuellt nätverkskort som har konfigurerats. Det andra gränssnittet är en virtuell SR-IOV-funktion (VF) som erbjuds av det fysiska nätverkets nätverkskort i Azure-värden. VF-gränssnittet visas i Linux-gästen som en PCI-enhet. Den använder Mellanox mlx4- eller mlx5-drivrutinen i Linux, eftersom Azure-värdar använder fysiska nätverkskort från Mellanox.

De flesta nätverkspaket går direkt mellan Linux-gästen och det fysiska nätverkskortet utan att passera den virtuella växeln eller någon annan programvara som körs på värden. På grund av den direkta åtkomsten till maskinvaran är nätverksfördröjningen lägre och mindre CPU-tid används för att bearbeta nätverkspaket jämfört med det syntetiska gränssnittet.

Olika Azure-värdar använder olika modeller av mellanox fysiska nätverkskort. Linux avgör automatiskt om mlx4- eller mlx5-drivrutinen ska användas. Azure-infrastrukturen styr placeringen av den virtuella datorn på Azure-värden. Utan ett kundalternativ för att ange vilket fysiskt nätverkskort en vm-distribution använder måste de virtuella datorerna innehålla båda drivrutinerna. Om en virtuell dator stoppas eller frigörs och sedan startas om kan den distribueras om på maskinvara med en annan modell av mellanox fysiska nätverkskort. Därför kan den använda den andra Mellanox-drivrutinen.

Om en VM-avbildning inte innehåller någon drivrutin för mellanox fysiska nätverkskort fortsätter nätverksfunktionerna att fungera med långsammare hastigheter för det virtuella nätverkskortet. Portalen, Azure CLI och Azure PowerShell visar funktionen Accelererat nätverk som aktiverad.

FreeBSD har samma stöd för accelererat nätverk som Linux när det körs i Azure. Resten av den här artikeln beskriver Linux och använder Linux-exempel, men samma funktioner är tillgängliga i FreeBSD.

Kommentar

Den här artikeln innehåller referenser till termen slav, en term som Microsoft inte längre använder. När den här termen tas bort från programvaran tar vi bort den från den här artikeln.

Bindning

Det syntetiska nätverksgränssnittet och VF-gränssnittet kopplas automatiskt ihop och fungerar som ett enda gränssnitt i de flesta aspekter som används av program. Netvsc-drivrutinen gör bindningen. Beroende på Linux-distributionen kan udev-regler och skript hjälpa dig att namnge VF-gränssnittet och konfigurera nätverket.

Om den virtuella datorn har konfigurerats med flera virtuella nätverkskort tillhandahåller Azure-värden ett unikt serienummer för var och en. Det gör att Linux kan utföra rätt parkoppling av syntetiska gränssnitt och VF-gränssnitt för varje virtuellt nätverkskort.

De syntetiska gränssnitten och VF-gränssnitten har samma MAC-adress. Tillsammans utgör de ett enda nätverkskort från andra nätverksentiteter som utbyter paket med det virtuella nätverkskortet på den virtuella datorn. Andra entiteter vidtar ingen särskild åtgärd på grund av förekomsten av både det syntetiska gränssnittet och VF-gränssnittet.

Båda gränssnitten ifconfig visas via kommandot eller ip addr i Linux. Här är ett exempel på ifconfig utdata:

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

Det syntetiska gränssnittet har alltid ett namn i formuläret eth\<n\>. Beroende på Linux-distributionen kan VF-gränssnittet ha ett namn i formuläret eth\<n\>. Eller så kan det ha ett annat namn i form av på grund av enP\<n\> en udev-regel som byter namn.

Du kan avgöra om ett visst gränssnitt är det syntetiska gränssnittet eller VF-gränssnittet med hjälp av kommandoraden shell som visar den enhetsdrivrutin som gränssnittet använder:

$ ethtool -i <interface name> | grep driver

Om drivrutinen är hv_netvscär det det syntetiska gränssnittet. VF-gränssnittet har ett drivrutinsnamn som innehåller "mlx". VF-gränssnittet kan också identifieras eftersom dess flags fält innehåller SLAVE. Den här flaggan anger att den kontrolleras av det syntetiska gränssnittet som har samma MAC-adress.

IP-adresser tilldelas endast till det syntetiska gränssnittet. Utdata från ifconfig eller ip addr visar även den här skillnaden.

Programanvändning

Program bör endast interagera med det syntetiska gränssnittet, precis som i andra nätverksmiljöer. Utgående nätverkspaket skickas från netvsc-drivrutinen till VF-drivrutinen och överförs sedan via VF-gränssnittet.

Inkommande paket tas emot och bearbetas i VF-gränssnittet innan de skickas till det syntetiska gränssnittet. Undantag är inkommande TCP SYN-paket och broadcast-/multicast-paket som endast bearbetas av det syntetiska gränssnittet.

Du kan kontrollera att paket flödar över VF-gränssnittet från utdata ethtool -S eth\<n\>från . Utdataraderna som innehåller vf visar trafiken över VF-gränssnittet. Till exempel:

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

Om dessa räknare ökar vid efterföljande körning av ethtool kommandot flödar nätverkstrafiken över VF-gränssnittet.

Du kan kontrollera att VF-gränssnittet finns som en PCI-enhet med hjälp lspci av kommandot . På den virtuella datorn generation 1 kan du till exempel få utdata som liknar följande utdata. (Virtuella datorer i generation 2 har inte äldre PCI-enheter.)

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)

I det här exemplet identifierar den sista utdataraden en VF från det fysiska nätverkskortet Mellanox Anslut X-4.

Kommandot ethtool -l eller ethtool -L (för att hämta och ange antalet överförings- och mottagningsköer) är ett undantag från vägledningen för att interagera med eth<n> gränssnittet. Du kan använda det här kommandot direkt mot VF-gränssnittet för att styra antalet köer för VF-gränssnittet. Antalet köer för VF-gränssnittet är oberoende av antalet köer för det syntetiska gränssnittet.

Tolka startmeddelanden

Under starten visar Linux många meddelanden som rör initiering och konfiguration av VF-gränssnittet. Den visar också information om bindningen med det syntetiska gränssnittet. Att förstå dessa meddelanden kan vara användbart när du identifierar eventuella problem i processen.

Här är exempelutdata från dmesg kommandot, trimmade till bara de rader som är relevanta för VF-gränssnittet. Beroende på linux-kernelversionen och -distributionen på den virtuella datorn kan meddelandena variera något, men det övergripande flödet är detsamma.

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

Netvsc-drivrutinen för eth0 har registrerats.

[    6.944883] hv_vmbus: registering driver hv_pci

Den virtuella VMbus PCI-drivrutinen har registrerats. Den här drivrutinen tillhandahåller grundläggande PCI-tjänster på en virtuell Linux-dator i Azure. Du måste registrera det innan VF-gränssnittet kan identifieras och konfigureras.

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

PCI-enheten med det angivna GUID:et (tilldelat av Azure-värden) har identifierats. Det tilldelas ett PCI-domän-ID (0xcf63 i det här fallet) baserat på GUID. PCI-domän-ID:t måste vara unikt för alla PCI-enheter som är tillgängliga på den virtuella datorn. Det här unika kravet omfattar andra Mellanox VF-gränssnitt, GPU:er, NVMe-enheter och andra enheter som kan finnas på den virtuella datorn.

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

En Mellanox VF som använder mlx5-drivrutinen har identifierats. Mlx5-drivrutinen börjar initiera enheten.

[    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

Motsvarande syntetiska gränssnitt som använder netvsc-drivrutinen har identifierat en matchande VF. Mlx5-drivrutinen känner igen att den har kopplats till det syntetiska gränssnittet.

[    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-kerneln gav ursprungligen namnet VF-gränssnittet eth1. En udev-regel bytte namn på den för att undvika förvirring med namnen på de syntetiska gränssnitten.

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

Mellanox VF-gränssnittet är nu aktivt.

[    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

Dessa meddelanden anger att datasökvägen för det bundna paret har växlat för att använda VF-gränssnittet. Ungefär 1,6 sekunder senare växlar den tillbaka till det syntetiska gränssnittet. Sådana växlar kan inträffa två eller tre gånger under startprocessen och är normalt beteende när konfigurationen initieras.

[    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

Det sista meddelandet anger att datasökvägen har växlats till med hjälp av VF-gränssnittet. Det förväntas under den virtuella datorns normala drift.

Azure-värdservice

Under azure-värdservicen kan alla VF-gränssnitt tillfälligt tas bort från den virtuella datorn. När servicen är klar läggs VF-gränssnitten tillbaka till den virtuella datorn. Normal drift fortsätter. Medan den virtuella datorn fungerar utan VF-gränssnitten fortsätter nätverkstrafiken att flöda genom det syntetiska gränssnittet utan avbrott i programmen.

I det här sammanhanget kan Azure-värdtjänsten omfatta uppdatering av komponenterna i Azure-nätverksinfrastrukturen eller fullständig uppgradering av Azure-värdhypervisor-programvaran. Sådana underhållshändelser inträffar vid tidsintervall som är beroende av driftsbehoven för Azure-infrastrukturen. Dessa händelser inträffar vanligtvis flera gånger under ett år.

Den automatiska växlingen mellan VF-gränssnittet och det syntetiska gränssnittet säkerställer att underhållshändelser inte stör arbetsbelastningarna om program endast interagerar med det syntetiska gränssnittet. Svarstider och CPU-belastning kan vara högre under dessa perioder på grund av användningen av det syntetiska gränssnittet. Varaktigheten för sådana perioder är vanligtvis cirka 30 sekunder, men kan ibland vara så lång som några minuter.

Borttagningen och läsningen av VF-gränssnittet under en underhållshändelse visas i dmesg utdata i den virtuella datorn. Här är typiska utdata:

[   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

Datasökvägen har växlats bort från VF-gränssnittet och VF-gränssnittet har avregistrerats. Nu har Linux tagit bort all kunskap om VF-gränssnittet och fungerar som om accelererat nätverk inte var aktiverat.

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

När VF-gränssnittet har lästs upp när servicen har slutförts identifieras en ny PCI-enhet med det angivna GUID:et. Det tilldelas samma PCI-domän-ID (0xcf63) som tidigare. Hanteringen av det lästa VF-gränssnittet är som hanteringen under den första starten.

[   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-drivrutinen initierar VF-gränssnittet och gränssnittet fungerar nu. Utdata liknar utdata under den första starten.

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

Datasökvägen har växlats tillbaka till VF-gränssnittet.

Inaktivera eller aktivera accelererat nätverk på en virtuell dator som inte körs

Du kan inaktivera eller aktivera accelererat nätverk på ett virtuellt nätverkskort på en virtuell dator som inte körs med hjälp av Azure CLI. Till exempel:

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

Om du inaktiverar accelererat nätverk som är aktiverat på den virtuella gästdatorn genereras utdata dmesg . Det är samma sak som när VF-gränssnittet tas bort för Azure-värdservice. Aktivering av accelererat nätverk genererar samma dmesg utdata som när VF-gränssnittet läss efter Azure-värdservice.

Du kan använda dessa Azure CLI-kommandon för att simulera Azure-värdservice. Du kan sedan kontrollera att dina program inte är felaktigt beroende av direkt interaktion med VF-gränssnittet.

Nästa steg