Freigeben über


Microsoft Azure Netzwerkadapter (MANA) und DPDK unter Linux

Der Microsoft Azure Netzwerkadapter (MANA) ist neue Hardware für Azure virtuellen Computer, um einen höheren Durchsatz und eine höhere Zuverlässigkeit zu ermöglichen. 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

Ältere Azure Linux-VMs basieren auf den mlx4- oder mlx5-Treibern und der zugehörigen Hardware für beschleunigte Netzwerke. Azure DPDK-Benutzer würden bestimmte Schnittstellen zum Ein- oder Ausschließen auswählen, 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.

MANA-DPDK EAL-Argumente

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

Kernelunterstützung

Das Ausführen von DPDK auf MANA-Hardware erfordert den Linux-Kernel 6.14 oder höher oder einen Backport der Ethernet- und InfiniBand-Treiber aus dem Linux-Kernel 6.14 oder höher. Außerdem sind bestimmte Versionen von DPDK und User-Space-Treibern erforderlich. Das MANA-DPDK erfordert die folgenden Treiber:

  • DPDK MANA Poll-Mode-Treiber (Die letzten 3 stabilen Versionen)
  • Libmana-Treiber im Benutzerspeicher (rdma-core v44 und höher)

Hinweis

DPDK unterstützt offiziell die letzten drei stabilen Treiberversionen. Kunden mit älteren DPDK-Versionen müssen alle MANA-Patches aus einer der unterstützten stabilen Versionen zurückportieren.

Hinweis

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

Unterstützte Marketplace-Images

Eine vollständige Liste der unterstützten Marktplatz-Images können Sie in der "Azure Accelerated Networking Übersicht" finden.

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: Microsoft 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-netvsc-Konfiguration auf 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. Beispiel geht davon aus, dass eine Azure VM mit zwei beschleunigten Netzwerk-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 Herunterfahren der Schnittstelle.

Wenn das MANA-gebundene Gerät nicht auf DOWN festgelegt wird, kann das zu einem niedrigen oder gar keinem Paketdurchsatz führen. Das Nichtfreigeben des Geräts kann zu der EAL-Fehlermeldung im Zusammenhang mit Übertragungswarteschlangen führen.

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

Fehler beim Aktivieren von großen Seiten.

Versuchen Sie, Großseiten zu aktivieren, und stellen Sie sicher, dass 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"

Failoverkonfiguration von net_failsafe oder net_vdev_netvsc poll-mode-drivers wird für hohe Leistung bei Azure 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 bei 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 liegt wahrscheinlich daran, 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.