Udostępnij za pośrednictwem


Microsoft Azure Network Adapter (MANA) i DPDK w systemie Linux

Karta sieciowa platformy Microsoft Azure (MANA) to nowy sprzęt dla maszyn wirtualnych platformy Azure, który umożliwia zwiększenie przepływności i niezawodności. Aby korzystać z programu MANA, użytkownicy muszą modyfikować procedury inicjowania zestawu DPDK. Usługa MANA wymaga dwóch zmian w porównaniu ze starszym sprzętem:

  • Argumenty MANA EAL dla sterownika trybu sondowania (PMD) różnią się od poprzedniego sprzętu.
  • Przed rozpoczęciem inicjowania zestawu DPDK jądro systemu Linux musi zwolnić kontrolę nad interfejsami sieciowymi MANA.

Procedura instalacji zestawu DPDK MANA została opisana w przykładowym kodzie.

Wprowadzenie

Starsze maszyny wirtualne z systemem Linux platformy Azure korzystają ze sterowników mlx4 lub mlx5 oraz towarzyszącego sprzętu dla przyspieszonej sieci. Użytkownicy zestawu DPDK platformy Azure wybraliby określone interfejsy do uwzględnienia lub wykluczenia przez przekazanie adresów magistrali do EAL zestawu DPDK. Procedura instalacji zestawu DPDK MANA różni się nieznacznie, ponieważ założenie jednego adresu magistrali dla interfejsu przyspieszonej sieci nie jest już prawdziwe. Zamiast używać adresu magistrali PCI, usługa MANA PMD używa adresu MAC do określenia interfejsu, z którym powinien być powiązany.

Argumenty EAL klucza DPDK MANA

Sonda MANA PMD wszystkie urządzenia i porty w systemie, gdy nie --vdev ma argumentu; --vdev argument nie jest obowiązkowy. W środowiskach testowych często pożądane jest pozostawienie jednego (podstawowego) interfejsu dostępnego do obsługi połączenia SSH z maszyną wirtualną. Aby użyć zestawu DPDK z podzbiorem dostępnych plików VFs, użytkownicy powinni przekazać zarówno adres magistrali urządzenia MANA, jak i adres MAC interfejsów w argumencie --vdev . Aby uzyskać więcej szczegółów, przykładowy kod jest dostępny w celu zademonstrowania inicjowania EAL zestawu DPDK na platformie MANA.

Aby uzyskać ogólne informacje na temat warstwy abstrakcji środowiska DPDK (EAL):

Wymagania dotyczące klucza DPDK dla rozwiązania MANA

Użycie zestawu DPDK na sprzęcie MANA wymaga jądra systemu Linux 6.2 lub nowszego lub backport sterowników Ethernet i InfiniBand z najnowszego jądra systemu Linux. Wymaga również określonych wersji zestawu DPDK i sterowników przestrzeni użytkownika.

Zestaw DPDK MANA wymaga następującego zestawu sterowników:

  1. Sterownik Ethernet jądra systemu Linux (jądro 5.15 i nowsze)
  2. Sterownik InfiniBand jądra systemu Linux (jądro 6.2 i nowsze)
  3. Sterownik trybu sondowania DPDK MANA (DPDK 22.11 lub nowszy)
  4. Sterowniki przestrzeni użytkownika Libmana (rdma-core w wersji 44 lub nowszej)

Obsługiwane obrazy z witryny Marketplace

Niewyczerpnięta lista obrazów z wstecznymi poprawkami dla zestawu DPDK z rozwiązaniem 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)

Uwaga

Zestaw DPDK MANA nie jest dostępny dla systemu Windows; będzie działać tylko na maszynach wirtualnych z systemem Linux.

Przykład: sprawdzanie pod kątem usługi MANA

Uwaga

W tym artykule przyjęto założenie, że pakiet pciutils zawierający polecenie lspci jest zainstalowany w systemie.

# 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

Przykład: instalacja zestawu DPDK (Ubuntu 22.04)

Uwaga

W tym artykule założono, że w systemie są zainstalowane zgodne jądro i 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

Przykład: Testpmd setup and netvsc test (Przykład: konfiguracja testowa i netvsc)

Zanotuj poniższy przykładowy kod do uruchamiania zestawu DPDK z rozwiązaniem MANA. Zalecana jest konfiguracja "netvsc" bezpośrednio do vf na platformie Azure w celu uzyskania maksymalnej wydajności za pomocą narzędzia MANA.

Uwaga

Zestaw DPDK wymaga włączenia 2 MB lub 1 GB ogromnych stron. W przykładzie przyjęto założenie, że maszyna wirtualna platformy Azure z dołączonymi 2 przyspieszonymi kartami sieciowymi.

# 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

Rozwiązywanie problemów

Nie można ustawić interfejsu.

Nie można ustawić urządzenia powiązanego z usługą MANA na wartość DOWN, co może spowodować niską lub zerową przepływność pakietów. Niepowodzenie wydania urządzenia może spowodować wyświetlenie komunikatu o błędzie EAL związanego z przesyłaniem kolejek.

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

Nie można włączyć ogromnych stron.

Spróbuj włączyć ogromne strony i upewnić się, że informacje są widoczne w 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

Niska przepływność z użyciem --vdev="net_vdev_netvsc0,iface=eth1"

Konfiguracja trybu failover sterowników net_failsafe trybu failover ani net_vdev_netvsc sterowników trybu sondowania nie jest zalecana w przypadku wysokiej wydajności na platformie Azure. Konfiguracja netvsc z zestawem DPDK w wersji 20.11 lub nowszej może dać lepsze wyniki. Aby uzyskać optymalną wydajność, upewnij się, że pakiety jądra systemu Linux, rdma-core i DPDK spełniają wymienione wymagania dotyczące zestawów DPDK i MANA.

Niezgodność wersji dla rdma-core

Niezgodność w rdma-core i jądro systemu Linux może wystąpić w dowolnym momencie; często występują, gdy użytkownik tworzy kombinację rdma-core, DPDK i jądra systemu Linux ze źródła. Ten typ niezgodności wersji może spowodować niepowodzenie sondy funkcji wirtualnej 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

Prawdopodobnie wynika to z używania jądra z wstecznymi poprawkami dla mana_ib z nowszą wersją rdma-core. Główną przyczyną jest interakcja między sterownikami RDMA jądra a bibliotekami rdma-core przestrzeni użytkownika.

Uapi jądra systemu Linux dla RDMA zawiera listę identyfikatorów dostawcy RDMA, w zdekportowanych wersjach jądra ta wartość identyfikatora może różnić się od wersji w bibliotekach rdma-core.

{! UWAGA} Przykładowe fragmenty kodu pochodzą z systemu Ubuntu 5.150-1045 linux-azure i rdma-core w wersji 46.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
};

Ta niezgodność powoduje niepowodzenie załadowania kodu dostawcy MANA. Użyj gdb polecenia , aby śledzić wykonanie polecenia dpdk-testpmd , aby potwierdzić, że dostawca ERDMA został załadowany zamiast dostawcy MANA. Driver_id MANA musi być spójna zarówno dla jądra, jak i rdzenia rdma. Identyfikatory MANA PMD są ładowane poprawnie, gdy te identyfikatory są zgodne.