Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Microsoft Azure Síťový adaptér (MANA) je nový hardware pro Azure virtuální počítače, 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 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 Azure virtuálních počítačů s Linuxem závisí na ovladačích mlx4 nebo mlx5 a doprovodném hardwaru pro akcelerované síťové služby. Uživatelé Azure DPDK by si vybrali konkrétní rozhraní, která mají být zahrnuta nebo vyloučena, předáním adres sběrnice do DPDK EAL. Postup nastavení pro MANA DPDK se mírně liší, protože předpoklad jedné adresy sběrnice na každé rozhraní s akcelerovaným síťováním už neplatí. 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 MANA DPDK EAL
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
Podpora jádra
Spuštění DPDK na hardwaru MANA vyžaduje linuxové jádro 6.14 nebo novější nebo backport ovladačů Ethernet a InfiniBand z jádra Linuxu 6.14 nebo novější. Vyžaduje také konkrétní verze DPDK a ovladačů uživatelského prostoru. MANA DPDK vyžaduje následující sadu ovladačů:
- Ovladač DPDK MANA v režimu hlasování (posledních 3 stabilních verzí)
- Ovladače uživatelského prostoru Libmana (rdma-core v44 a novější)
Poznámka:
DPDK oficiálně podporuje poslední tři stabilní verze ovladačů. Zákazníci se starší verzí DPDK potřebují backportovat všechny opravy MANA z jedné z podporovaných stabilních verzí.
Poznámka:
MANA DPDK není k dispozici pro Windows; bude fungovat jenom na virtuálních počítačích s Linuxem.
Podporované image z Marketplace
Úplný seznam podporovaných imagí z marketplace najdete v části <
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: Microsoft 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 knihovna 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
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' s přímým nastavením vf na Azure se doporučuje pro maximální výkon s MANA.
Poznámka:
DPDK vyžaduje, aby byly povoleny velké stránky o velikosti 2 MB nebo 1 GB. Příklad předpokládá, že virtuální počítač Azure s připojenými 2 akcelerovaný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 deaktivovat rozhraní.
Selhání nastavení zařízení vázaného na MANA na DOWN může vést k nízké nebo nulové propustnosti paketů. Neúspěch při uvolnění zařízení může způsobit chybovou zprávu EAL související s frontami přenosu.
mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19
Nepodařilo se povolit velké 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 převzetí služeb při selhání ovladače net_failsafe nebo net_vdev_netvsc poll-mode-drivers se nedoporučuje pro vysoký výkon 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 rdma-core
Neshody v rdma-core a linuxovým jádrem mohou nastat kdykoli; často k nim dochází, když uživatel vytváří určitou kombinaci rdma-core, DPDK a linuxového jádra z drojového kódu. 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í rdma-core. 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, že kód poskytovatele MANA se nepodaří načíst. Použijte gdb ke sledování provádění dpdk-testpmd a potvrďte, že je načten zprostředkovatel ERDMA místo zprostředkovatele MANA. MANA driver_id musí být konzistentní pro kernel i rdma-core. Služba MANA PMD se správně načte, když se shodují tyto identifikátory.