Partager via


Carte réseau Microsoft Azure (MANA) et DPDK sur Linux

La carte réseau Microsoft Azure (MANA) est un nouveau composant matériel destiné à améliorer le débit et la fiabilité des machines virtuelles Azure. Pour utiliser MANA, les utilisateurs doivent modifier leurs routines d’initialisation du kit DPDK. MANA nécessite deux modifications par rapport au matériel hérité :

  • Les arguments EAL de MANA pour le pilote en mode interrogation (PMD) sont différents de ceux du composant matériel précédent.
  • Le noyau Linux doit libérer le contrôle des interfaces réseau MANA avant le commencement de l’initialisation du kit DPDK.

La procédure d’installation du kit DPDK MANA est décrite dans l’exemple de code.

Introduction

Les machines virtuelles Azure Linux héritées s’appuient sur les pilotes mlx4 ou mlx5 et le matériel associé pour les performances réseau accélérées. Les utilisateurs du kit DPDK Azure sélectionnent les interfaces à inclure ou exclure en passant les adresses de bus à la couche EAL du kit DPDK. La procédure d’installation du kit DPDK MANA est légèrement différente, car l’hypothèse d’une adresse de bus par interface de performances réseau accélérées ne tient plus. Au lieu d’utiliser une adresse de bus PCI, le pilote PMD MANA utilise l’adresse MAC pour déterminer à quelle l’interface il doit se lier.

Arguments EAL du kit DPDK MANA

Le pilote PMD MANA sonde l’ensemble des appareils et des ports du système lorsqu’aucun argument --vdev n’est présent ; l’argument --vdev n’est pas obligatoire. Dans les environnements de test, il est souvent souhaitable de laisser une interface (principale) disponible pour la maintenance de la connexion SSH à la machine virtuelle. Pour utiliser le kit DPDK avec un sous-ensemble des fonctions virtuelles (VF) disponibles, les utilisateurs doivent passer à la fois l’adresse de bus de l’appareil MANA et l’adresse MAC des interfaces indiquées dans l’argument --vdev. Pour plus d’informations, un exemple de code est disponible pour illustrer l’initialisation de la couche EAL du kit DPDK sur MANA.

Pour obtenir des informations générales sur la couche d’abstraction d’environnement (EAL) du kit DPDK :

Exigences du kit DPDK pour MANA

L’utilisation de DPDK sur le matériel MANA nécessite le noyau Linux 6.2 ou et versions ultérieures, ou un rétroportage des pilotes Ethernet et InfiniBand depuis le dernier noyau Linux. Elle nécessite également des versions spécifiques de DPDK et de pilotes d’espace utilisateur.

Le kit DPDK MANA nécessite le jeu de pilotes suivant :

  1. Pilote Ethernet du noyau Linux (noyau 5.15 et versions ultérieures)
  2. Pilote InfiniBand du noyau Linux (noyau 6.2 et versions ultérieures)
  3. Pilote d’interrogation MANA DPDK (DPDK 22.11 et versions ultérieures)
  4. Pilotes d’espace utilisateur Libmana (rdma-core v44 et versions ultérieures)

Images du marketplace pris en charge

Liste non exhaustive d’images avec des correctifs rétroportés pour le kit DPDK avec 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)

Remarque

Le kit DPDK MANA n’est pas disponible pour Windows ; il fonctionne uniquement sur les machines virtuelles Linux.

Exemple : vérifier la présence de MANA

Remarque

Cet article suppose que le package pciutils contenant la commande lspci est installé sur le système.

# 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

Exemple : installation du kit DPDK (Ubuntu 22.04)

Remarque

Cet article suppose qu’un noyau compatible et rdma-core sont installés sur le système.

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

Exemple : configuration de Testpmd et test netvsc

Notez l’exemple de code suivant pour exécuter le kit DPDK avec MANA. La configuration « netvsc » direct-to-vf sur Azure est recommandée pour bénéficier de performances maximales avec MANA.

Remarque

Le kit DPDK exige des hugepages de 2 Mo ou 1 Go pour être activé. Par exemple, une machine virtuelle Azure avec 2 cartes réseau accélérées est attachée.

# 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

Dépannage

Échec de la définition de l’interface sur down.

L’échec de la définition de l’appareil lié à MANA sur DOWN peut se traduire par un débit de paquets faible voire nul. L’échec de la libération de l’appareil peut entraîner le message d’erreur EAL lié aux files d’attente de transmission.

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

Échec de l’activation des hugepages.

Essayez d’activer les hugepages et de vérifier que les informations sont visibles dans meminfo.

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

Débit faible avec utilisation de --vdev="net_vdev_netvsc0,iface=eth1"

Il est déconseillé de configurer le basculement des pilotes en mode interrogation net_failsafe ou net_vdev_netvsc pour des performances élevées sur Azure. La configuration de netvsc avec le kit DPDK version 20.11 ou supérieure peut donner de meilleurs résultats. Pour des performances optimales, vérifiez que vos packages (noyau Linux, rdma-core et DPDK) répondent aux exigences listées pour le kit DPDK et MANA.

Incompatibilité de version pour rdma-core

Des incompatibilités dans rdma-core et le noyau Linux peuvent se produire à tout moment ; souvent, elles se produisent lorsqu’un utilisateur crée une combinaison de rdma-core, de kit DPDK et du noyau Linux à partir de la source. Ce type d’incompatibilité de version peut entraîner un échec de sonde de la fonction virtuelle MANA.

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

Cela résulte probablement de l’utilisation d’un noyau avec des correctifs rétroportés pour mana_ib avec une version plus récente de rdma-core. La cause racine est une interaction entre les pilotes RDMA du noyau et les bibliothèques rdma-core de l’espace utilisateur.

L’uapi du noyau Linux pour RDMA contient une liste d’ID de fournisseur RDMA. Dans les versions rétroportées du noyau, cette valeur d’ID peut différer de la version dans les bibliothèques rdma-core.

{! REMARQUE} Les exemples d’extraits de code proviennent d’Ubuntu 5.150-1045 linux-azure et 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
};

Cette incompatibilité entraîne l’échec du chargement du code du fournisseur MANA. Utilisez gdb pour suivre l’exécution de dpdk-testpmd pour confirmer que le fournisseur ERDMA est chargé au lieu du fournisseur MANA. Le driver_id MANA doit être cohérent pour le noyau et rdma-core. Le PMD MANA se charge correctement lorsque ces ID correspondent.