Microsoft Azure Network Adapter (MANA) dan DPDK di Linux
Microsoft Azure Network Adapter (MANA) adalah perangkat keras baru untuk komputer virtual Azure untuk memungkinkan throughput dan keandalan yang lebih tinggi. Untuk memanfaatkan MANA, pengguna harus memodifikasi rutinitas inisialisasi DPDK mereka. MANA memerlukan dua perubahan dibandingkan dengan perangkat keras warisan:
- Argumen MANA EAL untuk driver mode polling (PMD) berbeda dari perangkat keras sebelumnya.
- Kernel Linux harus merilis kontrol antarmuka jaringan MANA sebelum inisialisasi DPDK dimulai.
Prosedur penyiapan untuk MANA DPDK diuraikan dalam contoh kode..
Pendahuluan
VM Linux Azure warisan mengandalkan driver mlx4 atau mlx5 dan perangkat keras yang menyertainya untuk jaringan yang dipercepat. Pengguna Azure DPDK akan memilih antarmuka tertentu untuk disertakan atau dikecualikan dengan meneruskan alamat bus ke DPDK EAL. Prosedur penyiapan untuk MANA DPDK sedikit berbeda, karena asumsi satu alamat bus per antarmuka Jaringan Terakselerasi tidak lagi berlaku. Daripada menggunakan alamat bus PCI, MANA PMD menggunakan alamat MAC untuk menentukan antarmuka mana yang harus diikatnya.
Argumen MANA DPDK EAL
MANA PMD menyelidiki semua perangkat dan port pada sistem ketika tidak ada --vdev
argumen yang ada; --vdev
argumen tidak wajib. Dalam lingkungan pengujian, sering kali diinginkan untuk meninggalkan satu antarmuka (utama) yang tersedia untuk melayani koneksi SSH ke VM. Untuk menggunakan DPDK dengan subset VF yang tersedia, pengguna harus melewati alamat bus perangkat MANA dan alamat MAC antarmuka dalam --vdev
argumen. Untuk detail selengkapnya, contoh kode tersedia untuk menunjukkan inisialisasi DPDK EAL pada MANA.
Untuk informasi umum tentang Lapisan Abstraksi Lingkungan DPDK (EAL):
Persyaratan DPDK untuk MANA
Menggunakan DPDK pada perangkat keras MANA memerlukan kernel Linux 6.2 atau yang lebih baru atau backport driver Ethernet dan InfiniBand dari kernel Linux terbaru. Ini juga memerlukan versi tertentu dari DPDK dan driver ruang pengguna.
MANA DPDK memerlukan set driver berikut:
- Driver Ethernet kernel Linux (5.15 kernel dan yang lebih baru)
- Driver InfiniBand kernel Linux (kernel 6.2 dan yang lebih baru)
- Driver mode polling DPDK MANA (DPDK 22.11 dan yang lebih baru)
- Driver ruang pengguna Libmana (rdma-core v44 dan yang lebih baru)
Gambar Marketplace yang Didukung
Daftar gambar yang tidak ada habisnya dengan patch yang didukung untuk DPDK dengan 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)
Catatan
MANA DPDK tidak tersedia untuk Windows; ini hanya akan berfungsi pada VM Linux.
Contoh: Periksa MANA
Catatan
Artikel ini mengasumsikan paket pciutils yang berisi perintah lspci diinstal pada sistem.
# 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
Contoh: Penginstalan DPDK (Ubuntu 22.04)
Catatan
Artikel ini mengasumsikan kernel dan rdma-core yang kompatibel diinstal pada sistem.
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
Contoh: Penyiapan testpmd dan pengujian netvsc
Perhatikan contoh kode berikut untuk menjalankan DPDK dengan MANA. Konfigurasi 'netvsc' langsung ke vf di Azure direkomendasikan untuk performa maksimum dengan MANA.
Catatan
DPDK memerlukan halaman besar 2MB atau 1GB untuk diaktifkan. Contoh mengasumsikan Azure VM dengan 2 NIC jaringan terakselerasi yang terpasang.
# 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
Pemecahan Masalah
Gagal mengatur antarmuka ke bawah.
Kegagalan untuk mengatur perangkat terikat MANA ke DOWN dapat mengakibatkan throughput paket rendah atau nol. Kegagalan untuk merilis perangkat dapat mengakibatkan pesan kesalahan EAL yang terkait dengan pengiriman antrean.
mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19
Kegagalan untuk mengaktifkan halaman besar.
Coba aktifkan halaman besar dan memastikan informasi terlihat di 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
Throughput rendah dengan penggunaan --vdev="net_vdev_netvsc0,iface=eth1"
Konfigurasi failover driver net_failsafe
mode polling atau net_vdev_netvsc
tidak disarankan untuk performa tinggi di Azure. Konfigurasi netvsc dengan DPDK versi 20.11 atau yang lebih tinggi mungkin memberikan hasil yang lebih baik. Untuk performa optimal, pastikan kernel Linux, rdma-core, dan paket DPDK Anda memenuhi persyaratan yang tercantum untuk DPDK dan MANA.
Versi tidak cocok untuk rdma-core
Ketidakcocokan dalam rdma-core dan kernel linux dapat terjadi kapan saja; seringkali mereka terjadi ketika pengguna membangun beberapa kombinasi rdma-core, DPDK, dan kernel linux dari sumber. Jenis ketidakcocokan versi ini dapat menyebabkan pemeriksaan yang gagal dari fungsi virtual 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
Ini kemungkinan hasil dari menggunakan kernel dengan patch backported untuk mana_ib dengan versi rdma-core yang lebih baru. Akar penyebabnya adalah interaksi antara driver RDMA kernel dan pustaka rdma-core ruang pengguna.
Uapi kernel Linux untuk RDMA memiliki daftar ID penyedia RDMA, dalam versi kernel yang didukung nilai ID ini dapat berbeda dari versi di pustaka rdma-core.
{! CATATAN} Contoh cuplikan berasal dari Ubuntu 5.150-1045 linux-azure dan 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
};
Ketidakcocokan ini menyebabkan kode penyedia MANA gagal dimuat. Gunakan gdb
untuk melacak eksekusi dpdk-testpmd
untuk mengonfirmasi penyedia ERDMA dimuat alih-alih penyedia MANA. MANA driver_id harus konsisten untuk kernel dan rdma-core. MANA PMD dimuat dengan benar saat ID tersebut cocok.