Condividi tramite


Scheda di rete di Microsoft Azure (MANA) e DPDK in Linux

La scheda di rete di Microsoft Azure (MANA) è un nuovo hardware per le macchine virtuali di Azure che consente di abilitare una velocità effettiva e un'affidabilità più elevate. Per utilizzare MANA, gli utenti devono modificare le routine di inizializzazione di DPDK. MANA richiede due modifiche rispetto all'hardware legacy:

  • Gli argomenti MANA EAL per il driver in modalità polling (PMD) differiscono rispetto all'hardware precedente.
  • Il kernel Linux deve rilasciare il controllo delle interfacce di rete MANA prima dell'inizializzazione di DPDK.

La procedura di configurazione per MANA DPDK è descritta nel codice di esempio.

Introduzione

Le macchine virtuali Linux legacy di Azure si basano su driver mlx4 o mlx5 e sull'hardware associato per la rete accelerata. Gli utenti di DPDK di Azure devono selezionare interfacce specifiche da includere o escludere trasmettendo gli indirizzi bus a DPDK EAL. La procedura di configurazione di MANA DPDK è leggermente diversa, infatti il presupposto di un indirizzo bus per interfaccia di rete accelerata non è più valido. Invece di usare un indirizzo bus PCI, MANA PMD usa l'indirizzo MAC per determinare a quale interfaccia deve essere associato.

Argomenti EAL MANA DPDK

MANA PMD esegue il probe di tutti i dispositivi e delle porte nel sistema quando non è presente alcun argomento --vdev; l'argomento --vdev non è obbligatorio. Negli ambienti di test è spesso consigliabile lasciare un'interfaccia (primaria) disponibile per la manutenzione della connessione SSH alla macchina virtuale. Per usare DPDK con un subset di VF disponibili, gli utenti devono trasmettere sia l'indirizzo bus del dispositivo MANA, sia l'indirizzo MAC delle interfacce nell'argomento --vdev. Per maggiori dettagli, il codice di esempio è disponibile per una dimostrazione della inizializzazione EAL DPDK in MANA.

Per informazioni generali su EAL (Environment Abstraction Layer) DPDK:

Requisiti DPDK per MANA

L'uso di DPDK nell'hardware MANA richiede il kernel Linux 6.2 o versioni successive, o un backport dei driver Ethernet e InfiniBand del kernel Linux più recente. Inoltre, richiede versioni specifiche di DPDK e driver dello spazio utente.

MANA DPDK richiede il set di driver seguente:

  1. Driver Ethernet del kernel Linux (kernel 5.15 e versioni successive)
  2. Driver InfiniBand del kernel Linux (kernel 6.2 e versioni successive)
  3. Driver DPDK MANA in modalità polling (DPDK 22.11 e versioni successive)
  4. Driver spazio utente Libmana (rdma-core v44 e versioni successive)

Immagini di Microsoft Azure Marketplace supportate

Elenco non esauriente di immagini con patch sottoposte a backporting per DPDK con 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)

Nota

MANA DPDK non è disponibile per Windows; funziona soltanto nelle macchine virtuali Linux.

Esempio: controllare che MANA sia presente

Nota

In questo articolo si presuppone che il pacchetto pciutils contenente il comando lspci sia installato nel sistema.

# 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

Esempio: installazione di DPDK (Ubuntu 22.04)

Nota

In questo articolo si presuppone che nel sistema siano installati un kernel compatibile e rdma-core.

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

Esempio: Testpmd setup and netvsc test

Prendere nota del codice di esempio seguente per eseguire DPDK con MANA. Si consiglia la configurazione direct-to-vf 'netvsc' in Azure per ottenere le massime prestazioni con MANA.

Nota

DPDK richiede l'abilitazione hugepage da 2 MB o 1 GB. L'esempio presuppone una macchina virtuale di Azure con 2 schede di interfaccia di rete accelerate associate.

# 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

Risoluzione dei problemi

Impossibile impostare l'interfaccia come inattiva.

La mancata impostazione del dispositivo associato a MANA su INATTIVO, potrebbe comportare una velocità effettiva del pacchetto bassa o pari a zero. Il mancato rilascio del dispositivo può comportare la visualizzazione di un messaggio di errore EAL correlato alle code di trasmissione.

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

Mancata abilitazione di hugepage.

Provare ad abilitare le hugepage e verificare che le informazioni siano visibili in 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

Bassa velocità effettiva con l'uso di --vdev="net_vdev_netvsc0,iface=eth1"

La configurazione di failover dei driver net_failsafe o net_vdev_netvsc in modalità di polling è sconsigliata per le prestazioni elevate in Azure. La configurazione netvsc con DPDK versione 20.11 o successive, potrebbe offrire risultati migliori. Per prestazioni ottimali, assicurarsi che i pacchetti kernel Linux, rdma-core e DPDK soddisfino i requisiti elencati per DPDK e MANA.

Mancata corrispondenza della versione per rdma-core

Le mancate corrispondenze in rdma-core e nel kernel Linux si possono verificare in qualsiasi momento; spesso quando un utente sta creando una combinazione di rdma-core, DPDK e kernel Linux dall'origine. Questo tipo di mancata corrispondenza della versione può causare un probe non riuscito della funzione virtuale (VF) di 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

Questo probabilmente comporta l'uso di un kernel con patch sottoposte a backporting per mana_ib con una versione più recente di rdma-core. La causa radice è l'interazione tra i driver RDMA del kernel e le librerie rdma-core dello spazio utente.

L'uapi del kernel Linux per RDMA include un elenco di ID provider RDMA; nelle versioni con backporting del kernel questo valore ID può differire dalla versione nelle librerie rdma-core.

{!NOTA} I frammenti di codice di esempio provengono da Ubuntu 5.150-1045 linux-azure e 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
};

Questa mancata corrispondenza comporta che il codice del provider MANA non viene caricato. Usare gdb per tenere tracciare dell'esecuzione di dpdk-testpmd per confermare che è stato caricato il provider ERDMA anziché il provider MANA. Il driver_id MANA deve essere coerente sia per il kernel sia per rdma-core. PMD di MANA viene caricato correttamente quando questi ID corrispondono.