Funktionsweise des beschleunigten Netzwerkbetriebs auf virtuellen Linux- und FreeBSD-Computern

Wenn eine VM (Virtual Machine, virtueller Computer) in Azure erstellt wird, wird für jede virtuelle NIC in ihrer Konfiguration eine synthetische Netzwerkschnittstelle erstellt. Die synthetische Schnittstelle ist ein VMbus-Gerät, das den Treiber „netvsc“ verwendet. Netzwerkpakete, die diese synthetische Schnittstelle verwenden, werden über den virtuellen Switch im Azure-Host an das physische Netzwerk des Rechenzentrums übermittelt.

Wenn der virtuelle Computer mit beschleunigtem Netzwerkbetrieb konfiguriert ist, wird für jede konfigurierte virtuelle NIC eine zweite Netzwerkschnittstelle erstellt. Die zweite Schnittstelle ist eine virtuelle SR-IOV-Funktion (VF), die von der NIC des physischen Netzwerks im Azure-Host bereitgestellt wird. Die VF-Schnittstelle wird im Linux-Gast als PCI-Gerät angezeigt. Er verwendet den Mellanox mlx4- oder mlx5-Treiber unter Linux, da Azure-Hosts physische NICs von Mellanox verwenden.

Die meisten Netzwerkpakete werden direkt zwischen dem Linux-Gast und der physischen NIC übertragen, ohne den virtuellen Switch oder eine andere Software zu durchlaufen, die auf dem Host ausgeführt wird. Aufgrund des direkten Zugriffs auf die Hardware ist im Vergleich zur synthetischen Schnittstelle die Netzwerklatenz geringer, und es wird weniger CPU-Zeit zum Verarbeiten von Netzwerkpaketen benötigt.

Verschiedene Azure-Hosts verwenden unterschiedliche Modelle der physischen NIC von Mellanox. Linux entscheidet automatisch, ob der Treiber „mlx4“ oder „mlx5“ verwendet wird. Die Azure-Infrastruktur steuert die Platzierung des virtuellen Computers auf dem Azure-Host. Da der Kunde keine Möglichkeit hat, die physische NIC anzugeben, die von einer VM-Bereitstellung verwendet wird, müssen die virtuellen Computer beide Treiber enthalten. Wenn eine VM beendet oder ihre Zuordnung aufgehoben und sie dann neu gestartet wird, kann es vorkommen, dass sie auf Hardware mit einem anderen Modell der physischen NIC von Mellanox bereitgestellt wird. In diesem Fall kann dann der andere Mellanox-Treiber verwendet werden.

Wenn ein VM-Image keinen Treiber für die physische NIC von Mellanox beinhaltet, funktionieren Netzwerkfunktionen nach wie vor mit der geringeren Geschwindigkeit der virtuellen NIC. Im Portal, in der Azure CLI und in Azure PowerShell wird das Feature für beschleunigten Netzwerkbetrieb als aktiviert angezeigt.

FreeBSD bietet bei der Ausführung in Azure die gleiche Unterstützung für beschleunigten Netzwerkbetrieb wie Linux. Im weiteren Verlauf dieses Artikels werden Beschreibungen und Beispiele für Linux verwendet. Die gleichen Funktionen stehen aber auch in FreeBSD zur Verfügung.

Hinweis

Dieser Artikel enthält Verweise auf den Begriff Slave, einen Begriff, den Microsoft nicht mehr verwendet. Sobald dieser Begriff aus der Software entfernt wurde, wird er auch aus diesem Artikel entfernt.

Bindung

Die synthetische Netzwerkschnittstelle und die VF-Schnittstelle werden automatisch gekoppelt und fungieren in den meisten Bereichen, die von Anwendungen genutzt werden, als einzelne Schnittstelle. Der „netvsc“-Treiber übernimmt die Bindung. Je nach Linux-Distribution sind bei der Benennung der VF-Schnittstelle sowie bei der Netzwerkkonfiguration ggf. „udev“-Regeln und -Skripts hilfreich.

Wenn der virtuelle Computer mit mehreren virtuellen NICs konfiguriert ist, stellt der Azure-Host jeweils eine eindeutige Seriennummer bereit. Dies ermöglicht es Linux, die ordnungsgemäße Koppelung von synthetischen Schnittstellen und VF-Schnittstellen für jede virtuelle NIC vorzunehmen.

Die synthetische Schnittstelle und die VF-Schnittstelle haben die gleiche MAC-Adresse. Für andere Netzwerkentitäten, die Pakete mit der virtuellen NIC auf der VM austauschen, stellen sie gemeinsam eine einzelne NIC dar. Von anderen Entitäten werden angesichts der Existenz der synthetischen Schnittstelle und der VF-Schnittstelle keine besonderen Aktionen ausgeführt.

Beide Schnittstellen sind in Linux über den Befehl ifconfig oder ip addr sichtbar. Hier sehen Sie eine Beispielausgabe von 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

Der Name der synthetischen Schnittstelle hat immer das Format „eth\<n\>“. Abhängig von der Linux-Distribution kann die VF-Schnittstelle einen Namen im Format „eth\<n\>“ haben. Es ist auch ein anderer Name in der Form enP\<n\> möglich, wenn durch eine udev-Regel eine Umbenennung vorgenommen wurde.

Sie können ermitteln, ob es sich bei einer bestimmten Schnittstelle um die synthetische Schnittstelle oder um die VF-Schnittstelle handelt, indem Sie die Befehlszeile der Shell verwenden, die den von der Schnittstelle verwendeten Gerätetreiber anzeigt:

$ ethtool -i <interface name> | grep driver

Wenn der Treiber hv_netvsc heißt, handelt es sich um die synthetische Schnittstelle. Die VF-Schnittstelle verfügt über einen Treibernamen, der „mlx“ enthält. Die VF-Schnittstelle ist auch identifizierbar, da ihr „flags“-Feld „SLAVE“ enthält. Dieses Flag gibt an, dass sie sich unter der Kontrolle der synthetischen Schnittstelle mit der gleichen MAC-Adresse befindet.

IP-Adressen werden nur der synthetischen Schnittstelle zugewiesen. Die Ausgabe von „ifconfig“ oder „ip addr“ zeigt diese Unterscheidung ebenfalls an.

Anwendungsnutzung

Anwendungen sollten wie in jeder anderen Netzwerkumgebung nur mit der synthetischen Schnittstelle interagieren. Ausgehende Netzwerkpakete werden vom Treiber „netvsc“ an den VF-Treiber übergeben und dann über die VF-Schnittstelle übertragen.

Eingehende Pakete werden von der VF-Schnittstelle empfangen und verarbeitet, bevor sie an die synthetische Schnittstelle übergeben werden. Ausnahmen sind eingehende TCP-SYN-Pakete und Broadcast-/Multicastpakete. Diese werden nur von der synthetischen Schnittstelle verarbeitet.

Die Ausgabe von ethtool -S eth\<n\> gibt Aufschluss darüber, ob Pakete die VF-Schnittstelle durchlaufen. Die Ausgabezeilen mit vf enthalten den Datenverkehr, der die VF-Schnittstelle durchläuft. Beispiel:

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

Wenn sich diese Zähler bei der nachfolgenden Ausführung des Befehls „ethtool“ erhöhen, durchläuft Netzwerkdatenverkehr die VF-Schnittstelle.

Mithilfe des Befehls „lspci“ können Sie überprüfen, ob die VF-Schnittstelle als PCI-Gerät vorhanden ist. Möglicherweise erhalten Sie beispielsweise für eine VM der Generation 1 eine Ausgabe, die der folgenden ähnelt. (VMs der Generation 2 verfügen nicht über die Legacy-PCI-Geräte.)

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 diesem Beispiel wird in der letzten Zeile der Ausgabe eine VF der physischen NIC „ConnectX-4“ von Mellanox identifiziert.

Die Befehle „ethtool -l“ oder „ethtool -L“ (zum Abrufen und Festlegen der Anzahl von Übertragungs- und Empfangswarteschlangen) sind Ausnahmen vom Leitfaden, der empfiehlt, mit der Schnittstelle „eth<n>“ zu interagieren. Sie können diesen Befehl direkt für die VF-Schnittstelle verwenden, um die Anzahl von Warteschlangen für die VF-Schnittstelle zu steuern. Die Anzahl von Warteschlangen für die VF-Schnittstelle ist unabhängig von der Warteschlangenanzahl für die synthetische Schnittstelle.

Interpretieren von Startup-Meldungen

Beim Startup werden von Linux zahlreiche Meldungen im Zusammenhang mit der Initialisierung und Konfiguration der VF-Schnittstelle angezeigt. Es werden auch Informationen zur Bindung mit der synthetischen Schnittstelle angezeigt. Das Verständnis dieser Meldungen kann hilfreich sein, um Probleme im Prozess zu identifizieren.

Die folgende Beispielausgabe des Befehls „dmesg“ wurde auf die Zeilen gekürzt, die im Hinblick auf die VF-Schnittstelle relevant sind. Die Meldungen können sich zwar je nach Linux-Kernelversion und -Distribution auf Ihrer VM geringfügig unterscheiden, der allgemeine Ablauf ist jedoch gleich.

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

Der Treiber „netvsc“ wurde für „eth0“ registriert.

[    6.944883] hv_vmbus: registering driver hv_pci

Der virtuelle VMbus-PCI-Treiber wurde registriert. Dieser Treiber stellt zentrale PCI-Dienste in einer Linux-VM in Azure bereit. Sie müssen sie registrieren, bevor die VF-Schnittstelle erkannt und konfiguriert werden kann.

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

Das PCI-Gerät mit der aufgeführten (vom Azure-Host zugewiesenen) GUID wurde erkannt. Ihm wird basierend auf der GUID eine PCI-Domänen-ID (in diesem Fall: 0xcf63) zugewiesen. Die PCI-Domänen-ID muss auf allen PCI-Geräten, die auf dem virtuellen Computer verfügbar sind, eindeutig sein. Diese Eindeutigkeitsanforderung gilt auch für andere Mellanox-VF-Schnittstellen, GPUs, NVMe- und andere Geräte, die ggf. auf der VM vorhanden sind.

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

Es wurde eine Mellanox-VF gefunden, die „mlx5“-Treiber verwendet. Der „mlx5“-Treiber beginnt mit der Initialisierung des Geräts.

[    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

Von der entsprechenden synthetischen Schnittstelle, die den Treiber „netvsc“ verwendet, wurde eine passende VF erkannt. Der Treiber „mlx5“ erkennt die Verknüpfung mit der synthetischen Schnittstelle.

[    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

Der Linux-Kernel benannte die VF-Schnittstelle zunächst „eth1“. Sie wurde durch eine udev-Regel umbenannt, um Verwechslungen mit den Namen der synthetischen Schnittstellen zu vermeiden.

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

Die Mellanox-VF-Schnittstelle ist jetzt aktiv.

[    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

Diese Meldungen geben an, dass der Datenpfad für das gekoppelte Paar auf die Verwendung der VF-Schnittstelle umgestellt wurde. Etwa 1,6 Sekunden später wird wieder zur synthetischen Schnittstelle gewechselt. Solche Wechsel können während des Startup-Vorgangs zwei- oder dreimal auftreten und sind während der Initialisierung der Konfiguration normal.

[    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

Die letzte Meldung gibt an, dass der Datenpfad auf die Verwendung der VF-Schnittstelle umgestellt wurde. Dies wird während des normalen Betriebs des virtuellen Computers erwartet.

Wartung des Azure-Hosts

Während einer Wartung des Azure-Hosts werden möglicherweise alle VF-Schnittstellen vorübergehend von der VM entfernt. Nach Abschluss der Wartung werden die VF-Schnittstellen dem virtuellen Computer wieder hinzugefügt. Anschließend wird der Betrieb normal fortgesetzt. Während der virtuelle Computer ohne die VF-Schnittstellen betrieben wird, durchläuft der Netzwerkdatenverkehr weiterhin die synthetische Schnittstelle, ohne dass es dabei zu einer Unterbrechung der Anwendungen kommt.

In diesem Zusammenhang kann die Wartung des Azure-Hosts die Aktualisierung der Komponenten der Azure-Netzwerkinfrastruktur oder auch ein vollständiges Upgrade der Hypervisor-Software des Azure-Hosts umfassen. Solche Wartungsereignisse treten abhängig von den betrieblichen Anforderungen der Azure-Infrastruktur in bestimmten Zeitintervallen auf. Solche Ereignisse treten in der Regel mehrmals pro Jahr auf.

Der automatische Wechsel zwischen der VF-Schnittstelle und der synthetischen Schnittstelle sicher, dass Workloads nicht durch Wartungsereignisse beeinträchtigt werden, wenn Anwendungen nur mit der synthetischen Schnittstelle interagieren. Wartezeiten und CPU-Auslastung können in diesen Zeiträumen aufgrund der Verwendung der synthetischen Schnittstelle höher sein. Solche Zeiträume dauern in der Regel etwa 30 Sekunden, können manchmal aber auch einige Minuten dauern.

Das Entfernen und erneute Hinzufügen der VF-Schnittstelle während eines Wartungsereignisses ist an der Ausgabe „dmesg“ auf der VM zu erkennen. Hier sehen Sie eine typische Ausgabe:

[   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

Der Datenpfad führt nicht mehr zur VF-Schnittstelle, und die Registrierung der VF-Schnittstelle wurde aufgehoben. An diesem Punkt hat Linux sämtliche Informationen zur VF-Schnittstelle entfernt und funktioniert so, als wäre der beschleunigte Netzwerkbetrieb nicht aktiviert.

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

Wenn die VF-Schnittstelle nach Abschluss der Wartung wieder hinzugefügt wird, wird ein neues PCI-Gerät mit der angegebenen GUID erkannt. Ihm wird die gleiche PCI-Domänen-ID (0xcf63) zugewiesen wie zuvor. Die Behandlung der erneut hinzugefügten VF-Schnittstelle entspricht der beim ursprünglichen Startup.

[   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

Der Treiber „mlx5“ initialisiert die VF-Schnittstelle, und die Schnittstelle kann nun verwendet werden. Die Ausgabe ähnelt der Ausgabe während des ursprünglichen Startups.

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

Der Datenpfad wurde wieder auf die VF-Schnittstelle festgelegt.

Deaktivieren oder Aktivieren des beschleunigten Netzwerkbetriebs auf einer nicht ausgeführten VM

Sie können den beschleunigten Netzwerkbetrieb auf einer virtuellen NIC auf einer nicht ausgeführten VM mithilfe der Azure CLI deaktivieren oder aktivieren. Beispiel:

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

Wenn der beschleunigte Netzwerkbetrieb auf dem Gast-VM aktiviert ist und deaktiviert wird, wird eine Ausgabe vom Typ „dmesg“ erzeugt. genau wie beim Entfernen der VF-Schnittstelle für die Wartung des Azure-Hosts. Beim Aktivieren des beschleunigten Netzwerkbetriebs wird die gleiche Ausgabe vom Typ „dmesg“ erzeugt wie beim erneuten Hinzufügen der VF-Schnittstelle nach der Wartung des Azure-Hosts.

Sie können diese Azure CLI-Befehle verwenden, um die Wartung des Azure-Hosts zu simulieren. Sie können dann sicherstellen, dass Ihre Anwendungen nicht fälschlicherweise von der direkten Interaktion mit der VF-Schnittstelle abhängen.

Nächste Schritte