Bagikan melalui


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:

  1. Driver Ethernet kernel Linux (5.15 kernel dan yang lebih baru)
  2. Driver InfiniBand kernel Linux (kernel 6.2 dan yang lebih baru)
  3. Driver mode polling DPDK MANA (DPDK 22.11 dan yang lebih baru)
  4. 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.