Delen via


Microsoft Azure Network Adapter (MANA) en DPDK in Linux

De Microsoft Azure Network Adapter (MANA) is nieuwe hardware voor virtuele Azure-machines om hogere doorvoer en betrouwbaarheid mogelijk te maken. Gebruikers moeten hun DPDK-initialisatieroutines wijzigen om gebruik te maken van MANA. VOOR MANA zijn twee wijzigingen vereist in vergelijking met verouderde hardware:

  • MANA EAL-argumenten voor het poll-mode-stuurprogramma (PMD) verschillen van de vorige hardware.
  • De Linux-kernel moet het beheer van de MANA-netwerkinterfaces vrijgeven voordat DPDK-initialisatie begint.

De installatieprocedure voor MANA DPDK wordt beschreven in de voorbeeldcode.

Inleiding

Verouderde Virtuele Azure Linux-machines zijn afhankelijk van de mlx4- of mlx5-stuurprogramma's en de bijbehorende hardware voor versneld netwerken. Azure DPDK-gebruikers selecteren specifieke interfaces die moeten worden opgenomen of uitgesloten door busadressen door te geven aan de DPDK EAL. De installatieprocedure voor MANA DPDK verschilt enigszins, omdat de aanname van één busadres per versnelde netwerkinterface niet meer waar is. In plaats van een PCI-busadres te gebruiken, gebruikt de MANA PMD het MAC-adres om te bepalen met welke interface het moet worden verbonden.

MANA DPDK EAL-argumenten

De MANA PMD test alle apparaten en poorten op het systeem wanneer er geen --vdev argument aanwezig is. Het --vdev argument is niet verplicht. In testomgevingen is het vaak wenselijk om één (primaire) interface beschikbaar te laten voor het onderhouden van de SSH-verbinding met de virtuele machine. Als u DPDK wilt gebruiken met een subset van de beschikbare VF's, moeten gebruikers zowel het busadres van het MANA-apparaat als het MAC-adres van de interfaces in het --vdev argument doorgeven. Voor meer informatie is voorbeeldcode beschikbaar om DPDK EAL-initialisatie op MANA te demonstreren.

Voor algemene informatie over de DPDK Environment Abstraction Layer (EAL):

DPDK-vereisten voor MANA

Voor het gebruik van DPDK op MANA-hardware is de Linux-kernel 6.2 of hoger of een backport van de Ethernet- en InfiniBand-stuurprogramma's van de nieuwste Linux-kernel vereist. Er zijn ook specifieke versies van DPDK en gebruikersruimtestuurprogramma's vereist.

VOOR MANA DPDK is de volgende set stuurprogramma's vereist:

  1. Linux-kernel Ethernet-stuurprogramma (5.15 kernel en hoger)
  2. Linux-kernel InfiniBand-stuurprogramma (6.2-kernel en hoger)
  3. DPDK MANA poll-mode stuurprogramma (DPDK 22.11 en hoger)
  4. Libmana-stuurprogramma's voor gebruikersruimte (rdma-core v44 en hoger)

Ondersteunde Marketplace-installatiekopieën

Een niet-actieve lijst met afbeeldingen met backported patches voor DPDK met 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)

Notitie

MANA DPDK is niet beschikbaar voor Windows; het werkt alleen op Linux-VM's.

Voorbeeld: Controleren op MANA

Notitie

In dit artikel wordt ervan uitgegaan dat het pciutils-pakket met de lspci-opdracht is geïnstalleerd op het systeem.

# 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

Voorbeeld: DPDK-installatie (Ubuntu 22.04)

Notitie

In dit artikel wordt ervan uitgegaan dat compatibele kernel en rdma-core op het systeem zijn geïnstalleerd.

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

Voorbeeld: Testpmd setup en netvsc-test

Noteer de volgende voorbeeldcode voor het uitvoeren van DPDK met MANA. De configuratie van direct-to-vf 'netvsc' in Azure wordt aanbevolen voor maximale prestaties met MANA.

Notitie

DPDK vereist dat enorme pagina's van 2 MB of 1 GB zijn ingeschakeld. In het voorbeeld wordt ervan uitgegaan dat een Virtuele Azure-machine met twee versnelde netwerkNIC's is gekoppeld.

# 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

Probleemoplossing

De interface kan niet worden ingesteld.

Als u het mana-gebonden apparaat niet instelt op DOWN, kan dit leiden tot een lage of nul pakketdoorvoer. De fout bij het vrijgeven van het apparaat kan het EAL-foutbericht met betrekking tot het verzenden van wachtrijen tot gevolg hebben.

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

Kan geen grote pagina's inschakelen.

Probeer enorme pagina's in te schakelen en ervoor te zorgen dat de informatie zichtbaar is 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

Lage doorvoer met gebruik van --vdev="net_vdev_netvsc0,iface=eth1"

Failoverconfiguratie van de net_failsafe stuurprogramma's of net_vdev_netvsc poll-mode-stuurprogramma's wordt niet aanbevolen voor hoge prestaties in Azure. De netvsc-configuratie met DPDK versie 20.11 of hoger kan betere resultaten opleveren. Voor optimale prestaties moet u ervoor zorgen dat uw Linux-kernel-, rdma-core- en DPDK-pakketten voldoen aan de vermelde vereisten voor DPDK en MANA.

Versie komt niet overeen voor rdma-core

Niet-overeenkomende items in rdma-core en de Linux-kernel kunnen op elk gewenst moment voorkomen; ze treden vaak op wanneer een gebruiker een combinatie van rdma-core, DPDK en de Linux-kernel van de bron bouwt. Dit type versie komt niet overeen met een mislukte test van de virtuele MANA-functie (VF).

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

Dit is waarschijnlijk het gevolg van het gebruik van een kernel met backported patches voor mana_ib met een nieuwere versie van rdma-core. De hoofdoorzaak is een interactie tussen de RDMA-stuurprogramma's van de kernel en rdma-core-bibliotheken van de gebruikersruimte.

De Linux-kernel uapi voor RDMA heeft een lijst met RDMA-provider-id's, in backported versies van de kernel kan deze id-waarde verschillen van de versie in de rdma-core-bibliotheken.

{! NOTE} Voorbeeldfragmenten zijn afkomstig van Ubuntu 5.150-1045 linux-azure en 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
};

Deze niet-overeenkomende resultaten in de MANA-providercode kan niet worden geladen. Gebruik gdb dit om de uitvoering te traceren om dpdk-testpmd te bevestigen dat de ERDMA-provider is geladen in plaats van de MANA-provider. De MANA-driver_id moet consistent zijn voor zowel de kernel als rdma-core. De MANA PMD wordt correct geladen wanneer deze id's overeenkomen.