Microsoft Azure hálózati adapter (MANA) és DPDK Linux rendszeren
A Microsoft Azure hálózati adapter (MANA) az Azure-beli virtuális gépek új hardvere, amely nagyobb átviteli sebességet és megbízhatóságot tesz lehetővé. A MANA használatához a felhasználóknak módosítaniuk kell a DPDK inicializálási rutinjait. A MANA két módosítást igényel az örökölt hardverhez képest:
- A lekérdezési módú illesztőprogram (PMD) MANA EAL argumentumai eltérnek a korábbi hardverektől.
- A Linux kernelnek a DPDK inicializálása előtt el kell engednie a MANA hálózati adapterek vezérlését.
A MANA DPDK beállítási eljárását a példakód ismerteti.
Bevezetés
Az örökölt Azure Linux rendszerű virtuális gépek az mlx4 vagy mlx5 illesztőprogramokra és a gyorsított hálózatkezeléshez szükséges hardverre támaszkodnak. Az Azure DPDK-felhasználók a DPDK EAL-nak átadott buszcímek révén kiválasztanak bizonyos illesztőket, amelyeket belefoglalnak vagy kizárnak. A MANA DPDK beállítási eljárása kissé eltér, mivel a gyorsított hálózati adapterenként egy buszcím feltételezése már nem igaz. PCI-buszcím használata helyett a MANA PMD a MAC-címmel határozza meg, hogy melyik felülethez kell csatlakoznia.
MANA DPDK EAL argumentumok
A MANA PMD a rendszeren lévő összes eszközt és portot mintavételozza, ha nincs --vdev
argumentum; az --vdev
argumentum nem kötelező. Tesztelési környezetekben gyakran kívánatos, hogy egy (elsődleges) felület legyen elérhető a virtuális gép SSH-kapcsolatának karbantartásához. Ha a DPDK-t az elérhető virtuális gépek egy részhalmazával szeretné használni, a felhasználóknak át kell adniuk a MANA-eszköz buszcímét és az argumentumban szereplő --vdev
interfészek MAC-címét is. További részletekért példakód érhető el a DPDK EAL inicializálásának bemutatásához a MANA-on.
A DPDK környezeti absztrakciós rétegével (EAL) kapcsolatos általános információk:
A MANA DPDK-követelményei
A DPDK MANA-hardveren való használatához a Linux kernel 6.2-s vagy újabb verziója, illetve a legújabb Linux-kernel Ethernet- és InfiniBand-illesztőinek háttérportja szükséges. Emellett a DPDK és a felhasználói hely illesztőprogramjainak meghatározott verzióira is szükség van.
A MANA DPDK-nak a következő illesztőprogram-készletre van szüksége:
- Linux kernel Ethernet-illesztő (5.15 kernel és újabb)
- Linux kernel InfiniBand illesztőprogram (6.2 kernel és újabb)
- DPDK MANA lekérdezési módú illesztőprogram (DPDK 22.11 és újabb)
- Libmana felhasználói hely illesztőprogramjai (rdma-core v44 és újabb verziók)
Támogatott Marketplace-rendszerképek
A DPDK-hoz és a MANA-hoz tartozó háttérbeli javításokkal rendelkező képek nem kimerítő listája:
- 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)
Feljegyzés
A MANA DPDK nem érhető el Windowshoz; Csak Linux rendszerű virtuális gépeken működik.
Példa: A MANA ellenőrzése
Feljegyzés
Ez a cikk feltételezi, hogy az lspci parancsot tartalmazó pciutils-csomag telepítve van a rendszeren.
# 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élda: DPDK-telepítés (Ubuntu 22.04)
Feljegyzés
Ez a cikk feltételezi, hogy kompatibilis kernel és rdma-core van telepítve a rendszeren.
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élda: Testpmd telepítő és netvsc teszt
Figyelje meg az alábbi példakódot a DPDK MANA-val való futtatásához. Az Azure-ban a közvetlen virtuális gép "netvsc" konfigurációja a MANA maximális teljesítményéhez ajánlott.
Feljegyzés
A DPDK-hoz 2 MB-os vagy 1 GB-os hatalmas lapokat kell engedélyezni. Tegyük fel például, hogy egy Azure-beli virtuális géphez 2 gyorsított hálózati hálózati adapter van csatlakoztatva.
# 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
Hibaelhárítás
Nem sikerült beállítani az illesztőt.
Ha nem állítja be a MANA-hez kötött eszközt DOWN értékre, az alacsony vagy nulla csomagteljesítményt eredményezhet. Az eszköz kiadásának sikertelensége az üzenetsorok küldéséhez kapcsolódó EAL-hibaüzenetet eredményezheti.
mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19
Nem sikerült engedélyezni a hatalmas oldalakat.
Engedélyezze a hatalmas oldalakat, és gondoskodjon arról, hogy az információ látható legyen a meminfo-ban.
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
Alacsony átviteli sebesség a következő használatával: --vdev="net_vdev_netvsc0,iface=eth1"
Az Azure-ban nem ajánlott a feladatátvételi konfiguráció vagy a net_failsafe
net_vdev_netvsc
lekérdezési módú illesztőprogramok esetében. A DPDK 20.11-es vagy újabb verziójával rendelkező Netvsc-konfiguráció jobb eredményeket adhat. Az optimális teljesítmény érdekében győződjön meg arról, hogy Linux-kernel-, rdma-core- és DPDK-csomagjai megfelelnek a DPDK-ra és a MANA-ra vonatkozó felsorolt követelményeknek.
Az rdma-core verzióeltérési eltérései
Az rdma-core és a Linux kernel eltérései bármikor előfordulhatnak; gyakran előfordulnak, amikor egy felhasználó rdma-core, DPDK és linux kernel valamilyen kombinációját készíti el a forrásból. Az ilyen típusú verzióeltérés a MANA virtuális függvény (VF) sikertelen mintavételét okozhatja.
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
Ez valószínűleg az rdma-core újabb verziójával rendelkező mana_ib háttérbeli javításokkal rendelkező kernel használatát eredményezi. A kiváltó ok a kernel RDMA-illesztőprogramok és a felhasználói tér rdma-core kódtárak közötti interakció.
Az RDMA-hoz készült Linux kernel uapi rendelkezik az RDMA-szolgáltató azonosítóinak listájával, a kernel backported verzióiban ez az azonosító értéke eltérhet az rdma-core kódtárak verziójától.
{! MEGJEGYZÉS} A példarészletek az Ubuntu 5.150-1045 linux-azure és rdma-core v46.0-ról származnak
// 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
};
Ez az eltérés azt eredményezi, hogy a MANA-szolgáltató kódja nem töltődik be. A végrehajtás dpdk-testpmd
nyomon követésére használható gdb
annak ellenőrzéséhez, hogy az ERDMA-szolgáltató betöltve van-e a MANA-szolgáltató helyett. A MANA driver_id konzisztensnek kell lennie mind a kernel, mind az rdma-core esetében. A MANA PMD megfelelően töltődik be, amikor ezek az azonosítók egyeznek.