Hoe versneld netwerken werkt in Linux- en FreeBSD-VM's

Wanneer een virtuele machine (VM) wordt gemaakt in Azure, wordt er een synthetische netwerkinterface gemaakt voor elke virtuele NIC in de configuratie. De synthetische interface is een VMbus-apparaat en maakt gebruik van het netvsc-stuurprogramma. Netwerkpakketten die gebruikmaken van deze synthetische interfacestroom via de virtuele switch in de Azure-host en naar het fysieke netwerk van het datacenter.

Als de virtuele machine is geconfigureerd met versneld netwerken, wordt er een tweede netwerkinterface gemaakt voor elke virtuele NIC die is geconfigureerd. De tweede interface is een virtuele SR-IOV-functie (VF) die wordt aangeboden door de NIC van het fysieke netwerk in de Azure-host. De VF-interface wordt weergegeven in de Linux-gast als een PCI-apparaat. Het gebruikt het Mellanox mlx4- of mlx5-stuurprogramma in Linux, omdat Azure-hosts fysieke NIC's van Mellanox gebruiken.

De meeste netwerkpakketten gaan rechtstreeks tussen de Linux-gast en de fysieke NIC zonder de virtuele switch of andere software te doorlopen die op de host wordt uitgevoerd. Vanwege de directe toegang tot de hardware is de netwerklatentie lager en wordt minder CPU-tijd gebruikt voor het verwerken van netwerkpakketten, in vergelijking met de synthetische interface.

Verschillende Azure-hosts gebruiken verschillende modellen van fysieke NIC van Mellanox. Linux bepaalt automatisch of het mlx4- of mlx5-stuurprogramma moet worden gebruikt. De Azure-infrastructuur bepaalt de plaatsing van de VIRTUELE machine op de Azure-host. Zonder de klantoptie om op te geven welke fysieke NIC een VM-implementatie gebruikt, moeten de VM's beide stuurprogramma's bevatten. Als een VIRTUELE machine is gestopt of de toewijzing ervan ongedaan wordt gemaakt en vervolgens opnieuw wordt opgestart, kan deze opnieuw worden geïmplementeerd op hardware met een ander model van fysieke NIC van Mellanox. Daarom kan het de andere Mellanox-stuurprogramma gebruiken.

Als een VM-installatiekopieën geen stuurprogramma voor de fysieke NIC van Mellanox bevatten, blijven netwerkmogelijkheden werken met de tragere snelheden van de virtuele NIC. In de portal, de Azure CLI en Azure PowerShell wordt de functie Versneld netwerken weergegeven als ingeschakeld.

FreeBSD biedt dezelfde ondersteuning voor versneld netwerken als Linux wanneer deze wordt uitgevoerd in Azure. De rest van dit artikel beschrijft Linux en maakt gebruik van Linux-voorbeelden, maar dezelfde functionaliteit is beschikbaar in FreeBSD.

Notitie

Dit artikel bevat verwijzingen naar de term slave, een term die Microsoft niet meer gebruikt. Wanneer deze term uit de software wordt verwijderd, wordt deze uit dit artikel verwijderd.

Binding

De synthetische netwerkinterface en VF-interface worden automatisch gekoppeld en fungeren als één interface in de meeste aspecten die door toepassingen worden gebruikt. Het netvsc-stuurprogramma doet de binding. Afhankelijk van de Linux-distributie kunnen udev-regels en -scripts helpen bij het benoemen van de VF-interface en bij het configureren van het netwerk.

Als de virtuele machine is geconfigureerd met meerdere virtuele NIC's, biedt de Azure-host een uniek serienummer voor elk NIC. Hiermee kan Linux de juiste koppeling van synthetische en VF-interfaces uitvoeren voor elke virtuele NIC.

De synthetische en VF-interfaces hebben hetzelfde MAC-adres. Samen vormen ze één NIC vanuit het oogpunt van andere netwerkentiteiten die pakketten uitwisselen met de virtuele NIC in de VM. Andere entiteiten ondernemen geen speciale actie vanwege het bestaan van zowel de synthetische interface als de VF-interface.

Beide interfaces zijn zichtbaar via de ifconfig of ip addr opdracht in Linux. Hier volgt een voorbeeld ifconfig van uitvoer:

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

De synthetische interface heeft altijd een naam in de vorm eth\<n\>. Afhankelijk van de Linux-distributie heeft de VF-interface mogelijk een naam in het formulier eth\<n\>. Of het kan een andere naam hebben in de vorm van enP\<n\> een udev-regel die de naam wijzigt.

U kunt bepalen of een bepaalde interface de synthetische interface of de VF-interface is met behulp van de shell-opdrachtregel waarin het apparaatstuurprogramma wordt weergegeven dat door de interface wordt gebruikt:

$ ethtool -i <interface name> | grep driver

Als het stuurprogramma is hv_netvsc, is het de synthetische interface. De VF-interface heeft een stuurprogrammanaam die mlx bevat. De VF-interface is ook identificeerbaar omdat het flags veld bevat SLAVE. Deze vlag geeft aan dat deze zich onder het beheer van de synthetische interface bevindt die hetzelfde MAC-adres heeft.

IP-adressen worden alleen toegewezen aan de synthetische interface. De uitvoer van ifconfig of ip addr toont dit onderscheid ook.

Toepassingsgebruik

Toepassingen moeten alleen communiceren met de synthetische interface, net als in een andere netwerkomgeving. Uitgaande netwerkpakketten worden van het netvsc-stuurprogramma doorgegeven aan het VF-stuurprogramma en vervolgens verzonden via de VF-interface.

Binnenkomende pakketten worden ontvangen en verwerkt op de VF-interface voordat ze worden doorgegeven aan de synthetische interface. Uitzonderingen zijn binnenkomende TCP SYN-pakketten en broadcast-/multicastpakketten die alleen door de synthetische interface worden verwerkt.

U kunt controleren of pakketten via de VF-interface stromen vanuit de uitvoer van ethtool -S eth\<n\>. De uitvoerlijnen die het verkeer via de VF-interface bevatten, worden vf weergegeven. Bijvoorbeeld:

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

Als deze tellers worden verhoogd bij de opeenvolgende uitvoering van de ethtool opdracht, loopt het netwerkverkeer via de VF-interface.

U kunt het bestaan van de VF-interface controleren als een PCI-apparaat met behulp van de lspci opdracht. Op de VM van de eerste generatie krijgt u bijvoorbeeld uitvoer die vergelijkbaar is met de volgende uitvoer. (Vm's van de tweede generatie hebben geen verouderde PCI-apparaten.)

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)

In dit voorbeeld identificeert de laatste regel uitvoer een VF van de fysieke NIC van Mellanox Verbinding maken X-4.

De ethtool -l or-opdracht ethtool -L (om het aantal verzend- en ontvangstwachtrijen op te halen en in te stellen) is een uitzondering op de richtlijnen voor interactie met de eth<n> interface. U kunt deze opdracht rechtstreeks op de VF-interface gebruiken om het aantal wachtrijen voor de VF-interface te beheren. Het aantal wachtrijen voor de VF-interface is onafhankelijk van het aantal wachtrijen voor de synthetische interface.

Opstartberichten interpreteren

Tijdens het opstarten toont Linux veel berichten met betrekking tot de initialisatie en configuratie van de VF-interface. Het toont ook informatie over de binding met de synthetische interface. Het begrijpen van deze berichten kan handig zijn bij het identificeren van eventuele problemen in het proces.

Hier ziet u voorbeelduitvoer van de dmesg opdracht, ingekort tot alleen de regels die relevant zijn voor de VF-interface. Afhankelijk van de Linux-kernelversie en -distributie in uw VIRTUELE machine kunnen de berichten enigszins variëren, maar de algehele stroom is hetzelfde.

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

Het netvsc-stuurprogramma is eth0 geregistreerd.

[    6.944883] hv_vmbus: registering driver hv_pci

Het virtuele PCI-stuurprogramma van VMbus is geregistreerd. Dit stuurprogramma biedt belangrijke PCI-services op een Virtuele Linux-machine in Azure. U moet deze registreren voordat de VF-interface kan worden gedetecteerd en geconfigureerd.

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

Het PCI-apparaat met de vermelde GUID (toegewezen door de Azure-host) is gedetecteerd. Er wordt een PCI-domein-id (in dit geval 0xcf63) toegewezen op basis van de GUID. De PCI-domein-id moet uniek zijn voor alle PCI-apparaten die beschikbaar zijn in de VM. Deze uniekheidsvereiste omvat andere Mellanox VF-interfaces, GPU's, NVMe-apparaten en andere apparaten die mogelijk aanwezig zijn in de virtuele machine.

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

Er is een Mellanox VF gedetecteerd die gebruikmaakt van het mlx5-stuurprogramma. Het mlx5-stuurprogramma begint met de initialisatie van het apparaat.

[    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

De bijbehorende synthetische interface die gebruikmaakt van het netvsc-stuurprogramma heeft een overeenkomende VF gedetecteerd. Het mlx5-stuurprogramma herkent dat het is verbonden met de synthetische interface.

[    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

De Linux-kernel heeft in eerste instantie de VF-interface eth1genoemd. De naam van een udev-regel is gewijzigd om verwarring te voorkomen met de namen die aan de synthetische interfaces zijn gegeven.

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

De Mellanox VF-interface is nu actief en actief.

[    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

Deze berichten geven aan dat het gegevenspad voor het gekoppelde paar is overgeschakeld naar het gebruik van de VF-interface. Ongeveer 1,6 seconden later schakelt het terug naar de synthetische interface. Dergelijke switches kunnen twee of drie keer optreden tijdens het opstartproces en zijn normaal gedrag wanneer de configuratie wordt geïnitialiseerd.

[    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

Het laatste bericht geeft aan dat het gegevenspad is overgeschakeld naar het gebruik van de VF-interface. Dit wordt verwacht tijdens de normale werking van de virtuele machine.

Onderhoud van Azure-hosts

Tijdens het onderhoud van de Azure-host kunnen alle VF-interfaces tijdelijk van de VM worden verwijderd. Wanneer het onderhoud is voltooid, worden de VF-interfaces weer toegevoegd aan de VIRTUELE machine. De normale werking wordt voortgezet. Terwijl de VIRTUELE machine zonder de VF-interfaces werkt, blijft het netwerkverkeer zonder onderbreking van toepassingen door de synthetische interface stromen.

In deze context kan het onderhoud van azure-hosts het bijwerken van de onderdelen van de Azure-netwerkinfrastructuur omvatten of de Hypervisor-software van de Azure-host volledig upgraden. Dergelijke onderhoudsbeurtenissen treden op tijdsintervallen op die afhankelijk zijn van de operationele behoeften van de Azure-infrastructuur. Deze gebeurtenissen vinden meestal meerdere keren plaats gedurende een jaar.

Het automatisch schakelen tussen de VF-interface en de synthetische interface zorgt ervoor dat onderhoudsevenementen werkbelastingen niet storen als toepassingen alleen communiceren met de synthetische interface. Latenties en CPU-belasting kunnen tijdens deze perioden hoger zijn vanwege het gebruik van de synthetische interface. De duur van dergelijke perioden is doorgaans ongeveer 30 seconden, maar soms kan het even lang zijn als een paar minuten.

Het verwijderen en lezen van de VF-interface tijdens een onderhoudsgebeurtenis is zichtbaar in de dmesg uitvoer in de VIRTUELE machine. Hier volgt een typische uitvoer:

[   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

Het gegevenspad is verwijderd van de VF-interface en de VF-interface is niet geregistreerd. Op dit moment heeft Linux alle kennis van de VF-interface verwijderd en werkt alsof versneld netwerken niet is ingeschakeld.

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

Wanneer de VF-interface wordt gelezen nadat het onderhoud is voltooid, wordt een nieuw PCI-apparaat met de opgegeven GUID gedetecteerd. Er wordt dezelfde PCI-domein-id (0xcf63) toegewezen als voorheen. De verwerking van de gelezen VF-interface is net als de verwerking tijdens het opstarten.

[   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

Het mlx5-stuurprogramma initialiseert de VF-interface en de interface is nu functioneel. De uitvoer is vergelijkbaar met de uitvoer tijdens het eerste opstarten.

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

Het gegevenspad is teruggeschakeld naar de VF-interface.

Versneld netwerken uitschakelen of inschakelen in een niet-uitgevoerde VM

U kunt versneld netwerken uitschakelen of inschakelen op een virtuele NIC in een niet-uitgevoerde VM met behulp van de Azure CLI. Bijvoorbeeld:

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

Het uitschakelen van versneld netwerken dat is ingeschakeld in de gast-VM produceert een dmesg uitvoer. Dit is hetzelfde als wanneer de VF-interface wordt verwijderd voor het onderhoud van de Azure-host. Het inschakelen van versneld netwerken produceert dezelfde dmesg uitvoer als wanneer de VF-interface wordt gelezen na onderhoud van de Azure-host.

U kunt deze Azure CLI-opdrachten gebruiken om onderhoud van Azure-hosts te simuleren. Vervolgens kunt u controleren of uw toepassingen niet onjuist afhankelijk zijn van directe interactie met de VF-interface.

Volgende stappen