Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Karta sieciowa Microsoft Azure (MANA) to nowy sprzęt dla maszyn wirtualnych Azure, aby zapewnić większą przepływność i niezawodność. 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 Azure maszyny wirtualne z systemem Linux korzystają ze sterowników mlx4 lub mlx5 oraz towarzyszącego sprzętu dla przyspieszonej sieci. Użytkownicy Azure DPDK wybraliby określone interfejsy do uwzględnienia lub wykluczenia przez przekazanie adresów magistrali do EAL. 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
MANA PMD bada wszystkie urządzenia i porty w systemie, gdy --vdev argument nie jest obecny; --vdev argument może być pominięty. 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, dostępny jest przykładowy kod demonstrujący inicjowanie EAL DPDK na platformie MANA.
Aby uzyskać ogólne informacje na temat warstwy abstrakcji środowiska DPDK (EAL):
Wymagania DPDK dla MANA
Obsługa jądra
Uruchomienie zestawu DPDK na sprzęcie MANA wymaga jądra systemu Linux 6.14 lub nowszego lub zaplecza sterowników Ethernet i InfiniBand z jądra systemu Linux w wersji 6.14 lub nowszej. Wymaga również określonych wersji pakietu DPDK i sterowników przestrzeni użytkownika. Zestaw DPDK MANA wymaga następującego zestawu sterowników:
- Sterownik trybu sondowania DPDK MANA (ostatnie 3 stabilne wersje)
- Sterowniki przestrzeni użytkownika Libmana (rdma-core w wersji 44 lub nowszej)
Uwaga
Zestaw DPDK oficjalnie obsługuje trzy ostatnie stabilne wersje sterowników. Klienci ze starszą wersją zestawu DPDK muszą przywrócić wszystkie poprawki MANA z jednej z obsługiwanych stabilnych wersji.
Uwaga
Zestaw DPDK MANA nie jest dostępny dla Windows; będzie działać tylko na maszynach wirtualnych z systemem Linux.
Obsługiwane obrazy z witryny Marketplace
Pełną listę obsługiwanych obrazów z Marketplace można znaleźć w omówieniu "Azure Accelerated Networking overview".
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: 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
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: Konfiguracja Testpmd i test netvsc
Zanotuj poniższy przykładowy kod do uruchamiania DPDK z MANA. Zalecana jest konfiguracja direct-to-vf "netvsc" w Azure, aby uzyskać maksymalną wydajność z MANA.
Uwaga
DPDK wymaga włączonych ogromnych stron o rozmiarze 2 MB lub 1 GB. Zakłada się, że maszyna wirtualna Azure ma dołączone 2 karty sieciowe o przyspieszonym działaniu.
# 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 wyłączyć 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 w zwolnieniu urządzenia może spowodować wyświetlenie komunikatu o błędzie EAL związanego z kolejkami transmisji.
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ć dużych stron.
Spróbuj włączyć duże strony i upewnij 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 lub net_vdev_netvsc w trybie odpytywania nie jest zalecana dla 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ści między rdma-core a jądrem systemu Linux mogą wystąpić w dowolnym momencie; często występują, gdy użytkownik kompiluje 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 backportowanymi poprawkami dla mana_ib z nowszą wersją rdma-core. Główną przyczyną jest interakcja między sterownikami jądra RDMA 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 do śledzenia wykonania dpdk-testpmd, aby potwierdzić, że załadowano dostawcę ERDMA zamiast dostawcy MANA. Driver_id MANA musi być spójny zarówno dla jądra, jak i rdzenia rdma-core. MANA PMD ładuje się poprawnie, gdy identyfikatory są zgodne.