Sdílet prostřednictvím


Microsoft Azure Network Adapter (MANA) a DPDK v Linuxu

Microsoft Azure Network Adapter (MANA) je nový hardware pro virtuální počítače Azure, který umožňuje vyšší propustnost a spolehlivost. Aby uživatelé mohli používat MANA, musí upravit své rutiny inicializace DPDK. MANA vyžaduje ve srovnání se starší verzí hardwaru dvě změny:

  • Argumenty MANA EAL pro ovladač režimu dotazování (PMD) se liší od předchozího hardwaru.
  • Před zahájením inicializace SADY DPDK musí jádro Linuxu uvolnit kontrolu nad síťovými rozhraními MANA.

Postup nastavení pro MANA DPDK je popsaný v ukázkovém kódu.

Úvod

Starší verze virtuálních počítačů Azure s Linuxem závisí na ovladačích mlx4 nebo mlx5 a doprovodném hardwaru pro akcelerované síťové služby. Uživatelé Sady Azure DPDK vyberou konkrétní rozhraní, která se mají zahrnout nebo vyloučit předáním adres sběrnice do rozhraní DPDK EAL. Postup nastavení pro MANA DPDK se mírně liší, protože předpoklad jedné adresy sběrnice na rozhraní akcelerovaných síťových služeb už nemá hodnotu true. Místo použití adresy sběrnice PCI používá MANA PMD adresu MAC k určení rozhraní, se kterým rozhraním se má svázat.

Argumenty EAL sady MANA DPDK

Systém MANA PMD testuje všechna zařízení a porty v systému, pokud neexistuje žádný --vdev argument. --vdev Argument není povinný. V testovacích prostředích je často žádoucí nechat jedno (primární) rozhraní dostupné pro obsluhu připojení SSH k virtuálnímu počítači. Pokud chcete použít DPDK s podmnožinou dostupných souborů VFS, měli by uživatelé předat jak adresu sběrnice zařízení MANA, tak adresu MAC rozhraní v argumentu --vdev . Další podrobnosti najdete v příkladu kódu, který předvede inicializaci EAL sady DPDK v MANA.

Obecné informace o abstraktní vrstvě prostředí DPDK (EAL):

Požadavky DPDK pro MANA

Použití DPDK na hardwaru MANA vyžaduje linuxové jádro 6.2 nebo novější nebo backport ovladačů Ethernet a InfiniBand z nejnovějšího jádra Linuxu. Vyžaduje také konkrétní verze DPDK a ovladačů uživatelského prostoru.

MANA DPDK vyžaduje následující sadu ovladačů:

  1. Ovladač Ethernet jádra Linuxu (jádro 5.15 a novější)
  2. Ovladač InfiniBand jádra Linuxu (jádro 6.2 a novější)
  3. Ovladač DPDK MANA v režimu hlasování (DPDK 22.11 a novější)
  4. Ovladače uživatelského prostoru Libmana (rdma-core v44 a novější)

Podporované image z Marketplace

Neexhaustive list of images with backported patch for DPDK with 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)

Poznámka:

MANA DPDK není k dispozici pro Windows; bude fungovat jenom na virtuálních počítačích s Linuxem.

Příklad: Kontrola mana

Poznámka:

Tento článek předpokládá, že v systému je nainstalovaný balíček pciutils obsahující příkaz lspci.

# 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

Příklad: Instalace DPDK (Ubuntu 22.04)

Poznámka:

Tento článek předpokládá, že je v systému nainstalováno kompatibilní jádro a jádro rdma.

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

Příklad: Nastavení Testpmd a test netvsc

Všimněte si následujícího příkladu kódu pro spuštění DPDK s MANA. Konfigurace netvsc direct-to-vf v Azure se doporučuje pro maximální výkon s využitím MANA.

Poznámka:

DPDK vyžaduje povolení 2 MB nebo 1 GB obrovských stránek. Příklad předpokládá, že virtuální počítač Azure s připojenými 2 akcelerovanými síťovými síťovými kartami.

# 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

Řešení problému

Nepodařilo se nastavit rozhraní.

Selhání nastavení zařízení vázaného na MANA na DOWN může vést k nízké nebo nulové propustnosti paketů. Selhání uvolnění zařízení může způsobit chybovou zprávu EAL související s přenosem front.

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

Nepovedlo se povolit obrovské stránky.

Zkuste povolit obrovské stránky a zajistit, aby informace byly viditelné v 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

Nízká propustnost s využitím --vdev="net_vdev_netvsc0,iface=eth1"

Konfigurace net_failsafe net_vdev_netvsc převzetí služeb při selhání ovladačů v režimu hlasování se nedoporučuje pro vysoký výkon v Azure. Konfigurace netvsc s DPDK verze 20.11 nebo vyšší může poskytovat lepší výsledky. Pro zajištění optimálního výkonu se ujistěte, že vaše linuxové jádro, rdma-core a balíčky DPDK splňují uvedené požadavky pro DPDK a MANA.

Neshoda verzí pro jádro rdma

Neshody v jádru rdma a linuxové jádro může dojít kdykoli; k nim často dochází, když uživatel vytváří určitou kombinaci rdma-core, DPDK a linuxového jádra ze zdroje. Tento typ neshody verzí může způsobit neúspěšnou sondu virtuální funkce 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

Výsledkem je pravděpodobně použití jádra s backportovanými opravami pro mana_ib s novější verzí jádra rdma. Hlavní příčinou je interakce mezi ovladači RDMA jádra a knihovnami rdma v uživatelském prostoru.

Linuxové jádro uapi pro RDMA má seznam ID zprostředkovatele RDMA, v backportovaných verzích jádra se tato hodnota ID může lišit od verze v knihovnách rdma-core.

{! POZNÁMKA} Ukázkové fragmenty kódu pocházejí z Ubuntu 5.150-1045 linux-azure a 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
};

Výsledkem této neshody je selhání načtení kódu zprostředkovatele MANA. Slouží gdb ke sledování provádění dpdk-testpmd potvrzení načtení zprostředkovatele ERDMA místo zprostředkovatele MANA. Driver_id MANA musí být konzistentní pro jádro i jádro rdma. Služba MANA PMD se správně načte, když se tato ID shodují.