Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
MANA (Microsoft Azure Network Adapter) är ny maskinvara för Azure virtuella 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 åt 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 Azure virtuella 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 att inkludera eller exkludera 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
Kernel-stöd
För att köra DPDK på MANA-maskinvara krävs Linux-kernel 6.14 eller senare eller en backport av Ethernet- och InfiniBand-drivrutinerna från Linux-kerneln 6.14 eller senare. Det kräver också specifika versioner av DPDK och drivrutiner för användarutrymme. MANA DPDK kräver följande uppsättning drivrutiner:
- DPDK MANA poll-mode driver (De senaste 3 stabila versionerna)
- Libmana-drivrutiner för användarutrymme (rdma-core v44 och senare)
Anteckning
DPDK stöder officiellt de tre senaste stabila drivrutinsutgåvorna. Kunder med äldre DPDK-version måste backportera alla MANA-korrigeringar från en av de stabila versioner som stöds.
Anteckning
MANA DPDK är inte tillgängligt för Windows. Det fungerar bara på virtuella Linux-datorer.
Marketplace-avbildningar som stöds
En fullständig lista över bilder på Marketplace som stöds finns i översikten "Azure Accelerated Networking".
Exempel: Sök efter MANA
Anteckning
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: 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
Exempel: DPDK-installation (Ubuntu 22.04)
Anteckning
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 "direct-to-vf 'netvsc'" på Azure rekommenderas för att maximera prestanda med MANA.
Anteckning
DPDK kräver antingen 2 MB eller 1 GB hugepages för att vara aktiverade. Exempel förutsätter en Azure virtuell 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änga av 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 leda till EAL-felmeddelandet som är relaterat till ö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åg genomströmning vid användning av --vdev="net_vdev_netvsc0,iface=eth1"
Redundanskonfiguration av antingen net_failsafe eller net_vdev_netvsc poll-mode-drivers rekommenderas inte för höga prestanda på 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 versionsinkonsekvens kan orsaka ett misslyckat test 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.