Dela via


Microsoft Azure Network Adapter (MANA) och DPDK på Linux

Microsoft Azure Network Adapter (MANA) är ny maskinvara för virtuella Azure-datorer för att ge högre dataflöde och tillförlitlighet. För att kunna använda MANA måste användarna ändra sina DPDK-initieringsrutiner. MANA kräver två ändringar jämfört med äldre maskinvara:

  • MANA EAL-argument för polllägesdrivrutinen (PMD) skiljer sig från tidigare maskinvara.
  • Linux-kerneln måste släppa kontrollen över MANA-nätverksgränssnitten innan DPDK-initieringen påbörjas.

Installationsproceduren för MANA DPDK beskrivs i exempelkoden..

Introduktion

Äldre virtuella Azure Linux-datorer förlitar sig på mlx4- eller mlx5-drivrutinerna och tillhörande maskinvara för accelererat nätverk. Azure DPDK-användare skulle välja specifika gränssnitt som ska inkluderas eller exkluderas genom att skicka bussadresser till DPDK EAL. Konfigurationsproceduren för MANA DPDK skiljer sig något, eftersom antagandet om en bussadress per accelererat nätverksgränssnitt inte längre gäller. I stället för att använda en PCI-bussadress använder MANA PMD MAC-adressen för att avgöra vilket gränssnitt den ska binda till.

MANA DPDK EAL-argument

MANA PMD avsöker alla enheter och portar i systemet när inget --vdev argument finns. --vdev Argumentet är inte obligatoriskt. I testmiljöer är det ofta önskvärt att lämna ett (primärt) gränssnitt tillgängligt för service av SSH-anslutningen till den virtuella datorn. Om du vill använda DPDK med en delmängd av de tillgängliga virtuella datorerna bör användarna skicka både bussadressen för MANA-enheten och MAC-adressen för gränssnitten --vdev i argumentet. För mer information finns exempelkod tillgänglig för att demonstrera DPDK EAL-initiering på MANA.

Allmän information om DPDK Environment Abstraction Layer (EAL):

DPDK-krav för MANA

Användning av DPDK på MANA-maskinvara kräver Linux-kernel 6.2 eller senare eller en backport av Ethernet- och InfiniBand-drivrutinerna från den senaste Linux-kärnan. Det kräver också specifika versioner av DPDK och drivrutiner för användarutrymme.

MANA DPDK kräver följande uppsättning drivrutiner:

  1. Linux kernel Ethernet-drivrutin (5.15 kernel och senare)
  2. InfiniBand-drivrutin för Linux-kernel (6.2-kernel och senare)
  3. DPDK MANA-polllägesdrivrutin (DPDK 22.11 och senare)
  4. Libmana-drivrutiner för användarutrymme (rdma-core v44 och senare)

Marketplace-avbildningar som stöds

En outtömmande lista över bilder med bakåtporterade korrigeringar för DPDK med 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)

Kommentar

MANA DPDK är inte tillgängligt för Windows. det fungerar bara på virtuella Linux-datorer.

Exempel: Sök efter MANA

Kommentar

Den här artikeln förutsätter att pciutils-paketet som innehåller kommandot lspci är installerat på systemet.

# 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

Exempel: DPDK-installation (Ubuntu 22.04)

Kommentar

Den här artikeln förutsätter att kompatibel kernel och rdma-core är installerade i systemet.

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

Exempel: Testpmd-konfiguration och netvsc-test

Observera följande exempelkod för att köra DPDK med MANA. Konfigurationen "netvsc" för direct-to-vf i Azure rekommenderas för maximal prestanda med MANA.

Kommentar

DPDK kräver antingen 2 MB eller 1 GB stora sidor för att aktiveras. Exempel förutsätter att en virtuell Azure-dator med 2 accelererade nätverkskort anslutna.

# 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

Felsökning

Det gick inte att ställa in gränssnittet.

Om du inte anger den MANA-bundna enheten till NED kan det leda till lågt eller noll paketdataflöde. Om enheten inte släpps kan det resultera i EAL-felmeddelandet som rör överföringsköer.

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

Det gick inte att aktivera stora sidor.

Prova att aktivera stora sidor och se till att informationen visas i 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

Lågt dataflöde med användning av --vdev="net_vdev_netvsc0,iface=eth1"

Redundanskonfiguration av varken drivrutinerna net_failsafe eller net_vdev_netvsc poll-mode-drivers rekommenderas inte för höga prestanda i Azure. Netvsc-konfigurationen med DPDK version 20.11 eller senare kan ge bättre resultat. Se till att dina Linux-kernel-, rdma-core- och DPDK-paket uppfyller de angivna kraven för DPDK och MANA för optimala prestanda.

Versionsmatchningsfel för rdma-core

Matchningar i rdma-core och Linux-kärnan kan inträffa när som helst. Ofta inträffar de när en användare skapar en kombination av rdma-core, DPDK och Linux-kerneln från källan. Den här typen av versionsmatchning kan orsaka en misslyckad avsökning av den virtuella funktionen MANA (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

Detta beror sannolikt på att du använder en kernel med bakåtporterade korrigeringar för mana_ib med en nyare version av rdma-core. Rotorsaken är en interaktion mellan RDMA-kerneldrivrutinerna och rdma-core-biblioteken för användarutrymme.

Linux-kernel-uapi för RDMA har en lista över RDMA-provider-ID:n, i backporterade versioner av kerneln kan det här ID-värdet skilja sig från versionen i rdma-core-biblioteken.

{! OBS} Exempelfragment är från Ubuntu 5.150-1045 linux-azure och 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
};

Det här matchningsfelet resulterar i att MANA-providerkoden inte kan läsas in. Använd gdb för att spåra körningen av dpdk-testpmd för att bekräfta att ERDMA-providern läses in i stället för MANA-providern. MANA-driver_id måste vara konsekvent för både kerneln och rdma-core. MANA PMD läses in korrekt när dessa ID:er matchar.