Teilen über


Microsoft Azure-Netzwerkadapter (MANA) und DPDK unter Linux

Der Microsoft Azure-Netzwerkadapter (MANA) ist eine neue Hardware für virtuelle Azure-Computer, um einen höheren Durchsatz und höhere Zuverlässigkeit zu erzielen. Um MANA nutzen zu können, müssen Benutzer*innen ihre DPDK-Initialisierungsroutinen ändern. MANA erfordert im Vergleich zu Legacyhardware zwei Änderungen:

  • Die MANA-EAL-Argumente für den Abfragemodustreiber (Poll-Mode Driver, PMD) unterscheiden sich von der vorherigen Hardware.
  • Der Linux-Kernel muss die Steuerung der MANA-Netzwerkschnittstellen freigeben, bevor die DPDK-Initialisierung beginnt.

Das Setupverfahren für das MANA-DPDK ist im Beispielcode beschrieben.

Einführung

Legacy-VMs mit Linux in Azure basieren auf den mlx4- oder mlx5-Treibern und der zugehörigen Hardware für den beschleunigten Netzwerkbetrieb. Benutzer*innen des Azure-DPDK können bestimmte Schnittstellen auswählen, die eingeschlossen oder ausgeschlossen werden sollen, indem sie Busadressen an das DPDK-EAL übergeben. Das Setupverfahren für das MANA-DPDK unterscheidet sich geringfügig, da die Annahme einer Busadresse pro Accelerated-Networking-Schnittstelle nicht mehr zutrifft. Anstatt eine PCI-Busadresse zu verwenden, verwendet der MANA-PMD die MAC-Adresse, um zu bestimmen, an welche Schnittstelle sie gebunden werden soll.

EAL-Argumente des MANA-DPDK

MANA PMD prüft alle Geräte und Ports im System, wenn kein --vdev-Argument vorhanden ist. Das --vdev-Argument ist nicht obligatorisch. In Testumgebungen ist es häufig wünschenswert, eine (primäre) Schnittstelle für die Verarbeitung der SSH-Verbindung mit der VM zu belassen. Um das DPDK mit einer Teilmenge der verfügbaren VFs zu verwenden, sollten Benutzer*innen sowohl die Busadresse des MANA-Geräts als auch die MAC-Adresse der Schnittstellen im --vdev-Argument übergeben. Für weitere Details steht Beispielcode zur Veranschaulichung der DPDK-EAL-Initialisierung in MANA zur Verfügung.

Allgemeine Informationen zur DPDK-EAL (Environment Abstraction Layer, Umgebungsabstraktionsschicht):

DPDK-Anforderungen für MANA

Die Verwendung von DPDK auf MANA-Hardware erfordert den Linux-Kernel 6.2 oder höher oder einen Backport der Ethernet- und InfiniBand-Treiber aus dem neuesten Linux-Kernel. Außerdem sind bestimmte Versionen von DPDK und Benutzeradressraum-Treibern erforderlich.

Das MANA-DPDK erfordert die folgenden Treiber:

  1. Linux-Kernel-Ethernet-Treiber (Kernel 5.15 und höher)
  2. Linux-Kernel-InfiniBand-Treiber (Kernel 6.2 und höher)
  3. DPDK MANA-Pollmodustreiber (DPDK 22.11 und höher)
  4. Libmana-Treiber für Benutzeradressraum (rdma-core v44 und höher)

Unterstützte Marketplace-Images

Eine unvollständige Liste der Images mit zurückportierten Patches für DPDK mit MANA:

  • Red Hat Enterprise Linux 8.9
  • Red Hat Enterprise Linux 9.4
  • Canonical Ubuntu Server 20.04 (5.15.0-1045-azure)
  • Canonical Ubuntu Server 22.04 (5.15.0-1045-azure)

Hinweis

Das MANA-DPDK ist für Windows nicht verfügbar. Es funktioniert nur auf Linux-VMs.

Beispiel: Überprüfung auf MANA

Hinweis

In diesem Artikel wird davon ausgegangen, dass das pciutils-Paket, das den Befehl „lspci“ enthält, auf dem System installiert ist.

# check for pci devices with ID:
#   vendor: Microsoft Corporation (1414)
#   class:  Ethernet Controller (0200)
#   device: Microsft Azure Network Adapter VF (00ba)
if [[ -n `lspci -d 1414:00ba:0200` ]]; then
    echo "MANA device is available."
else
    echo "MANA was not detected."
fi

Beispiel: DPDK-Installation (Ubuntu 22.04)

Hinweis

In diesem Artikel wird davon ausgegangen, dass kompatible Kernel und rdma-core auf dem System installiert sind.

DEBIAN_FRONTEND=noninteractive sudo apt-get install -q -y build-essential libudev-dev libnl-3-dev libnl-route-3-dev ninja-build libssl-dev libelf-dev python3-pip meson libnuma-dev

pip3 install pyelftools

# Try latest LTS DPDK, example uses DPDK tag v23.07-rc3
git clone https://github.com/DPDK/dpdk.git -b v23.07-rc3 --depth 1
pushd dpdk
meson build
cd build
ninja
sudo ninja install
popd

Beispiel: Testpmd-Setup und netvsc-Test

Beachten Sie den folgenden Beispielcode zum Ausführen des DPDK mit MANA. Die direct-to-vf-Konfiguration „netvsc“ in Azure wird für maximale Leistung mit MANA empfohlen.

Hinweis

Für die Aktivierung des DPDK sind entweder 2 MB oder 1 GB große Hugepages erforderlich. Das Beispiel geht davon aus, dass eine Azure-VM mit zwei beschleunigten NICs verbunden ist.

# Enable 2MB hugepages.
echo 1024 | tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages

# Assuming use of eth1 for DPDK in this demo
PRIMARY="eth1"

# $ ip -br link show master eth1 
# > enP30832p0s0     UP             f0:0d:3a:ec:b4:0a <... # truncated
# grab interface name for device bound to primary
SECONDARY="`ip -br link show master $PRIMARY | awk '{ print $1 }'`"
# Get mac address for MANA interface (should match primary)
MANA_MAC="`ip -br link show master $PRIMARY | awk '{ print $3 }'`"


# $ ethtool -i enP30832p0s0 | grep bus-info
# > bus-info: 7870:00:00.0
# get MANA device bus info to pass to DPDK
BUS_INFO="`ethtool -i $SECONDARY | grep bus-info | awk '{ print $2 }'`"

# Set MANA interfaces DOWN before starting DPDK
ip link set $PRIMARY down
ip link set $SECONDARY down


## Move synthetic channel to user mode and allow it to be used by NETVSC PMD in DPDK
DEV_UUID=$(basename $(readlink /sys/class/net/$PRIMARY/device))
NET_UUID="f8615163-df3e-46c5-913f-f2d2f965ed0e"
modprobe uio_hv_generic
echo $NET_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/new_id
echo $DEV_UUID > /sys/bus/vmbus/drivers/hv_netvsc/unbind
echo $DEV_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/bind

# MANA single queue test
dpdk-testpmd -l 1-3 --vdev="$BUS_INFO,mac=$MANA_MAC" -- --forward-mode=txonly --auto-start --txd=128 --rxd=128 --stats 2

# MANA multiple queue test (example assumes > 9 cores)
dpdk-testpmd -l 1-6 --vdev="$BUS_INFO,mac=$MANA_MAC" -- --forward-mode=txonly --auto-start --nb-cores=4  --txd=128 --rxd=128 --txq=8 --rxq=8 --stats 2

Problembehandlung

Fehler beim Festlegen der Schnittstelle auf DOWN

Wenn das MANA-gebundene Gerät nicht auf DOWN festgelegt wird, kann das zu einem niedrigen oder gar keinem Paketdurchsatz führen. Die EAL-Fehlermeldung im Zusammenhang mit Übertragungswarteschlangen kann dadurch verursacht werden, dass das Gerät nicht freigegeben werden kann.

mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19

Fehler beim Aktivieren von Hugepages

Versuchen Sie, Hugepages zu aktivieren, und überprüfen Sie, ob die Informationen in meminfo sichtbar sind.

EAL: No free 2048 kB hugepages reported on node 0
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
EAL: Error - exiting with code: 1
Cause: Cannot init EAL: Permission denied

Geringer Durchsatz bei Verwendung von --vdev="net_vdev_netvsc0,iface=eth1"

Für Hochleistung in Azure wird die Failoverkonfiguration der Abfragemodustreiber net_failsafe oder net_vdev_netvsc nicht empfohlen. Die netvsc-Konfiguration mit DPDK-Version 20.11 oder höher kann bessere Ergebnisse liefern. Stellen Sie sicher, dass Ihr Linux-Kernel, rdma-core und die DPDK-Pakete die aufgeführten Anforderungen für DPDK und MANA erfüllen, um eine optimale Leistung zu erzielen.

Versionskonflikt für rdma-core

In rdma-core und dem Linux-Kernel kann es jederzeit zu Konflikten kommen. Häufig treten sie auf, wenn ein Benutzer eine Kombination aus rdma-core, DPDK und dem Linux-Kernel aus der Quelle erstellt. Diese Art von Versionskonflikt kann zu einem fehlgeschlagenen Test der virtuellen MANA-Funktion (VF) führen.

EAL: Probe PCI driver: net_mana (1414:ba) device: 7870:00:00.0 (socket 0)
mana_arg_parse_callback(): key=mac value=00:0d:3a:76:3b:d0 index=0
mana_init_once(): MP INIT PRIMARY
mana_pci_probe_mac(): Probe device name mana_0 dev_name uverbs0 ibdev_path /sys/class/infiniband/mana_0
mana_probe_port(): device located port 2 address 00:0D:3A:76:3B:D0
mana_probe_port(): ibv_alloc_parent_domain failed port 2
mana_pci_probe_mac(): Probe on IB port 2 failed -12
EAL: Requested device 7870:00:00.0 cannot be used
EAL: Bus (pci) probe failed.
hn_vf_attach(): Couldn't find port for VF
hn_vf_add(): RNDIS reports VF but device not found, retrying

Das führt wahrscheinlich dazu, dass ein Kernel mit zurückportierten Patches für mana_ib mit einer neueren Version von rdma-core verwendet wird. Die Grundursache ist eine Interaktion zwischen den RDMA-Kerneltreibern und den rdma-core-Bibliotheken des Benutzers.

Die Linux-Kernel-UAPI für RDMA verfügt über eine Liste der RDMA-Anbieter-IDs. In zurückportierten Versionen des Kernels kann dieser ID-Wert von der Version in den rdma-core-Bibliotheken abweichen.

{!NOTE} Die Beispielcodeschnipsel stammen aus Ubuntu 5.150-1045 linux-azure und rdma-core v46.0.

// Linux kernel header
// include/uapi/rdma/ib_user_ioctl_verbs.h
enum rdma_driver_id {
	RDMA_DRIVER_UNKNOWN,
	RDMA_DRIVER_MLX5,
	RDMA_DRIVER_MLX4,
	RDMA_DRIVER_CXGB3,
	RDMA_DRIVER_CXGB4,
	RDMA_DRIVER_MTHCA,
	RDMA_DRIVER_BNXT_RE,
	RDMA_DRIVER_OCRDMA,
	RDMA_DRIVER_NES,
	RDMA_DRIVER_I40IW,
	RDMA_DRIVER_IRDMA = RDMA_DRIVER_I40IW,
	RDMA_DRIVER_VMW_PVRDMA,
	RDMA_DRIVER_QEDR,
	RDMA_DRIVER_HNS,
	RDMA_DRIVER_USNIC,
	RDMA_DRIVER_RXE,
	RDMA_DRIVER_HFI1,
	RDMA_DRIVER_QIB,
	RDMA_DRIVER_EFA,
	RDMA_DRIVER_SIW,
	RDMA_DRIVER_MANA, //<- MANA added as last member of enum after backporting
};

// Example mismatched rdma-core ioctl verbs header
// on github: kernel-headers/rdma/ib_user_ioctl_verbs.h
// or in release tar.gz: include/rdma/ib_user_ioctl_verbs.h
enum rdma_driver_id {
	RDMA_DRIVER_UNKNOWN,
	RDMA_DRIVER_MLX5,
	RDMA_DRIVER_MLX4,
	RDMA_DRIVER_CXGB3,
	RDMA_DRIVER_CXGB4,
	RDMA_DRIVER_MTHCA,
	RDMA_DRIVER_BNXT_RE,
	RDMA_DRIVER_OCRDMA,
	RDMA_DRIVER_NES,
	RDMA_DRIVER_I40IW,
	RDMA_DRIVER_IRDMA = RDMA_DRIVER_I40IW,
	RDMA_DRIVER_VMW_PVRDMA,
	RDMA_DRIVER_QEDR,
	RDMA_DRIVER_HNS,
	RDMA_DRIVER_USNIC,
	RDMA_DRIVER_RXE,
	RDMA_DRIVER_HFI1,
	RDMA_DRIVER_QIB,
	RDMA_DRIVER_EFA,
	RDMA_DRIVER_SIW,
	RDMA_DRIVER_ERDMA,  // <- This upstream has two additional providers
	RDMA_DRIVER_MANA,   // <- So MANA's ID in the enum does not match
};

Dieser Konflikt führt dazu, dass der MANA-Anbietercode nicht geladen werden kann. Verwenden Sie gdb, um die Ausführung von dpdk-testpmd nachzuverfolgen und zu bestätigen, dass der ERDMA-Anbieter anstelle des MANA-Anbieters geladen wird. Die driver_id von MANA muss sowohl für den Kernel als auch für rdma-core konsistent sein. MANA PMD wird ordnungsgemäß geladen, wenn diese IDs übereinstimmen.