Einrichten des DPDK auf einem virtuellen Linux-Computer

Data Plane Development Kit (DPDK) in Azure bietet ein schnelles Paketverarbeitungsframework auf Benutzerseite für leistungsintensive Anwendungen. Dieses Framework umgeht den Kernelnetzwerkstapel des virtuellen Computers.

Der Vorgang bei der herkömmlichen Paketverarbeitung mit Kernelnetzwerkstapel wird durch Interrupts gesteuert. Wenn die Netzwerkschnittstelle eingehende Pakete empfängt, wird ein Kernelinterrupt zum Verarbeiten des Pakets erzeugt, und es findet ein Kontextwechsel vom Kernel- zum Benutzerbereich statt. Mit DPDK entfallen der Kontextwechsel und die interruptgesteuerte Methode zugunsten einer Implementierung im Benutzerbereich mit Treibern im Abrufmodus, damit Pakete schnell verarbeitet werden können.

DPDK umfasst Gruppen von Benutzerbereichsbibliotheken, die Zugriff auf Ressourcen niedrigerer Ebene bereitstellen. Diese Ressourcen schließen Hardware, logische Kerne, Speicherverwaltung und Treiber im Abrufmodus für Netzwerk-Schnittstellenkarten ein.

DPDK kann auf Azure-VMs ausgeführt werden, die mehrere Betriebssystemverteilungen unterstützen. DPDK bietet eine zentrale Leistungsdifferenzierung bei der Steuerung von Implementierungen der Netzwerksfunktionsvirtualisierung. Diese Implementierungen können die Form virtueller Netzwerkgeräte (NVAs) annehmen, z.B. virtuelle Router, Firewalls, VPNs, Lastenausgleichsmodule, hoch entwickelte Paketkerne und DDoS-Anwendungen (Denial-of-Service).

Eine Liste der Setupanweisungen für DPDK auf MANA-VMs finden Sie hier: Microsoft Azure-Netzwerkadapter (MANA) und DPDK unter Linux.

Vorteil

Mehr Pakete pro Sekunde (pps) : Das Umgehen des Kernels und das Steuern der Pakete auf Benutzerseite verringern die Zyklen, da keine Kontextwechsel notwendig sind. Zudem wird die Rate der pro Sekunde verarbeiteten Pakete auf Linux-VMs in Azure verbessert.

Unterstützte Mindestversionen von Betriebssystemen

Die folgenden Distributionen aus dem Azure Marketplace werden unterstützt:

Linux-Betriebssystem Kernelversion
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud und höher

Die aufgeführten Versionen sind die Mindestanforderungen. Neuere Versionen werden ebenfalls unterstützt.

Eine Liste der Anforderungen für DPDK auf MANA-VMs finden Sie hier: Microsoft Azure-Netzwerkadapter (MANA) und DPDK unter Linux.

Benutzerdefinierte Kernelunterstützung

Nicht aufgeführte Linux-Kernelversionen finden Sie unter Patches zum Erstellen eines Linux-Kernels für Azure. Weitere Informationen erhalten Sie auch bei aznetdpdk@microsoft.com.

Unterstützung für Regionen

Alle Azure-Regionen unterstützen DPDK.

Voraussetzungen

Auf der Linux-VM muss der beschleunigte Netzwerkbetrieb aktiviert sein. Die VM sollte mindestens zwei Netzwerkschnittstellen haben, davon eine für die Verwaltung. Die Aktivierung des beschleunigten Netzwerks auf der Verwaltungsschnittstelle wird nicht empfohlen. Weitere Informationen finden Sie unter Erstellen eines virtuellen Linux-Computers mit beschleunigtem Netzwerkbetrieb.

Darüber hinaus verwendet DPDK RDMA-Verben, um Datenwarteschlangen auf dem Netzwerkadapter zu erstellen. Stellen Sie sicher, dass auf der VM die richtigen RDMA-Kerneltreiber geladen werden. Sie können je nach VM-Größe „mlx4_ib“, „mlx5_ib“ oder „mana_ib“ sein.

Eine Liste der DPDK-Installationsanweisungen für MANA-VMs finden Sie hier: Microsoft Azure-Netzwerkadapter (MANA) und DPDK unter Linux.

Installieren von Buildabhängigkeiten

RHEL7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

Manuelles Kompilieren und Installieren von DPDK

  1. Laden Sie das aktuellste DPDK herunter. Für Azure wird die Version 22.11 LTS oder höher empfohlen.

  2. Erstellen Sie die Standardkonfiguration mit meson builddir.

  3. Kompilieren Sie mit ninja -C builddir.

  4. Installieren Sie mit DESTDIR=<output folder> ninja -C builddir install.

Konfigurieren der Laufzeitumgebung

Führen Sie nach einem Neustart die folgenden Befehle einmalig aus:

  1. Umfangreiche Seiten

    • Konfigurieren Sie umfangreiche Seiten, indem Sie den folgenden Befehl einmal für jeden NUMA-Knoten ausführen:
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • Erstellen Sie ein Verzeichnis für die Bereitstellung mit mkdir /mnt/huge.

    • Stellen Sie umfangreiche Seiten mit mount -t hugetlbfs nodev /mnt/huge bereit.

    • Vergewissern Sie sich mit grep Huge /proc/meminfo, dass umfangreiche Seiten reserviert sind.

    • Das obige Beispiel gilt für 2M große Seiten. Es können auch 1G große Seiten verwendet werden.

    Hinweis

    Sie können die GRUB-Datei so ändern, dass umfangreiche Seiten beim Starten reserviert werden. Befolgen Sie dazu die Anweisungen für DPDK. Die Anweisungen befinden sich unten auf der Seite. Wenn Sie eine Linux-VM in Azure verwenden, ändern Sie Dateien stattdessen unter /etc/config/grub.d, um umfangreiche Seiten über Neustarts hinweg zu reservieren.

  2. MAC- und IP-Adressen: Verwenden Sie ifconfig –a, um die MAC- und IP-Adresse der Netzwerkschnittstellen anzuzeigen. Die VF-Netzwerkschnittstelle und die NETVSC-Netzwerkschnittstelle haben dieselbe MAC-Adresse, allerdings hat nur die NETVSC-Netzwerkschnittstelle eine IP-Adresse. VF-Schnittstellen werden als untergeordnete Schnittstellen von NETVSC-Schnittstellen ausgeführt.

  3. PCI-Adressen

    • Finden Sie mit ethtool -i <vf interface name> heraus, welche PCI-Adresse Sie für ethtool -i <vf interface name> verwenden können.

    • Wenn für eth0 der beschleunigte Netzwerkbetrieb aktiviert ist, vergewissern Sie sich, dass testpmd nicht versehentlich das VF-PCI-Gerät für eth0 übernimmt. Wenn die DPDK-Anwendung versehentlich die Verwaltungsnetzwerkschnittstelle übernimmt und dadurch die SSH-Verbindung unterbrochen wird, beenden Sie die DPDK-Anwendung über die serielle Konsole. Sie können die serielle Konsole auch zum Beenden oder Starten des virtuellen Computers verwenden.

  4. Laden Sie bei jedem Neustart ibuverbs mit modprobe -a ib_uverbs. Nur für SLES 15: Laden Sie auch mlx4_ib mit modprobe -a mlx4_ib.

Master-PMD

DPDK-Anwendungen müssen über den Master-PMD ausgeführt werden, der in Azure verfügbar gemacht wird. Wenn die Anwendung direkt über den VF-PMD ausgeführt wird, empfängt sie nicht alle Pakete, die an die VM gerichtet sind, da einige Pakete über die synthetische Schnittstelle angezeigt werden. DPDK unterstützt zwei Arten von Master-PMDs: NetVSC PMD und Failsafe PMD. Ein Master-PMD gewährleistet, dass die Anwendung alle Pakete erhält, die für sie bestimmt sind. Es wird außerdem sichergestellt, dass die Anwendung weiterhin im DPDK-Modus über den Master-PMD ausgeführt wird, auch wenn VF während der Wartung des Hosts aufgehoben wird.

NetVSC PMD

NetVSC ist die empfohlene PMD für die Ausführung als Master-PMD in Azure. NetVSC gewährleistet, dass die Anwendung alle Pakete erhält, die für sie bestimmt sind. Es wird außerdem sichergestellt, dass die Anwendung weiterhin im DPDK-Modus ausgeführt wird, auch wenn VF während der Wartung des Hosts aufgehoben wird. Weitere Informationen zur Verwendung und Konfiguration von NetVSC PMD finden Sie unter (https://doc.dpdk.org/guides/nics/netvsc.html).

Ausfallsicherer PMD

Hinweis: Die Ausführung mit Failsafe PMD wird in Azure nicht empfohlen. Wenn Ihre DPDK-Version 22.11 LTS oder höher ist, wird die Verwendung von NetVSC PMD empfohlen.

Alternativ können Sie eine DPDK-Anwendung über den ausfallsicheren PMD ausführen. Weitere Informationen zum ausfallsicheren PMD finden Sie unter Fail-safe poll mode driver library (Ausfallsicherheits-PMD-Bibliothek).

Ausführen von testpmd

Verwenden Sie sudo vor dem Befehl sudo, um testpmd im root-Modus auszuführen.

Basic: Integritätsprüfung, Initialisierung des Ausfallsicherheitsadapters

  1. Führen Sie die folgenden Befehle aus, um eine testpmd-Anwendung mit einem einzigen Port zu starten:

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. Führen Sie die folgenden Befehle aus, um eine testpmd-Anwendung mit zwei Ports zu starten:

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

Führen Sie nach dem Start show port info all aus, um die Portinformationen zu überprüfen. Es sollten ein oder zwei DPDK-Ports vom Typ „net_netvsc“ angezeigt werden.

  1. Starten Sie mit start <port> /stop <port> den Datenverkehr.

Die vorherigen Befehle starten testpmd im interaktiven Modus. Dies wird empfohlen, um einige testpmd-Befehle zu testen.

Basic: einzelner Absender/einzelner Empfänger

Mit den folgenden Befehlen werden Pakete in einem regelmäßigen Sekundentakt gedruckt:

  1. Führen Sie auf Absenderseite den folgenden Befehl aus:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Führen Sie auf Empfängerseite den folgenden Befehl aus:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Wenn Sie die vorherigen Befehle auf einer VM ausführen, ändern Sie IP_SRC_ADDR und IP_DST_ADDR in app/test-pmd/txonly.c vor dem Kompilieren entsprechend der tatsächlichen IP-Adresse der VM. Andernfalls werden die Pakete gelöscht, bevor sie den Empfänger erreichen.

Erweitert: einzelner Absender/einzelne Weiterleitung

Mit den folgenden Befehlen werden Pakete in einem regelmäßigen Sekundentakt gedruckt:

  1. Führen Sie auf Absenderseite den folgenden Befehl aus:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Führen Sie auf Weiterleitungsseite den folgenden Befehl aus:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Wenn Sie die vorherigen Befehle auf einer VM ausführen, ändern Sie IP_SRC_ADDR und IP_DST_ADDR in app/test-pmd/txonly.c vor dem Kompilieren entsprechend der tatsächlichen IP-Adresse der VM. Andernfalls werden die Pakete gelöscht, bevor sie die Weiterleitung erreichen. Es ist nicht möglich, dass ein dritter Computer den weitergeleiteten Datenverkehr empfängt, da die testpmd-Weiterleitung die Adressen der Schicht 3 nicht ändert, es sei denn, Sie nehmen einige Codeänderungen vor.

sudo yum install -y dpdk

References