Microsoft Azure 網路介面卡 (MANA) 和 Linux 上的 DPDK
Microsoft Azure 網路介面卡 (MANA) 是 Azure 虛擬機器的新硬體,提供更高的輸送量和可靠性。 若要使用 MANA,使用者必須修改其 DPDK 初始化常式。 與舊版硬體相比,MANA 需要進行兩項變更:
- 輪詢模式驅動程式 (PMD) 的 MANA EAL 引數與先前硬體不同。
- Linux 核心必須先釋出 MANA 網路介面的控制,才能開始進行 DPDK 初始化。
範例程式碼中概述 MANA DPDK 的安裝程序。
簡介
舊版 Azure Linux VM 依賴 mlx4 或 mlx5 驅動程式,以及加速網路隨附的硬體。 Azure DPDK 使用者可將流排位址傳遞至 DPDK EAL,來選取要包含或排除的特定介面。 MANA DPDK 的設定程序稍有不同,因為每個加速網路介面會有一個流排位址的假設不再成立。 MANA PMD 不會使用 PCI 流排位址,而是使用 MAC 位址來判斷其應該繫結的介面。
MANA DPDK EAL 引數
當沒有 --vdev
引數時,MANA PMD 會探查系統上的所有裝置和連接埠;--vdev
引數不是必要項目。 測試環境通常會保留一個可用的 (主要) 介面供 SSH 連線至 VM。 若要使用 DPDK 搭配可用 VF 子集,使用者應該將 MANA 裝置流排位址和介面的 MAC 位址傳遞至 --vdev
引數。 如需詳細資料,請參閱 MANA 上的 DPDK EAL 初始化中示範的範例程式碼。
如需 DPDK 環境抽象層 (EAL) 的一般資訊:
MANA 的 DPDK 需求
在 MANA 硬體上使用 DPDK 需要 Linux 核心 6.2 或更新版本,或是最新 Linux 核心中乙太網路和 InfiniBand 驅動程式的向後移植。 同時需要特定版本的 DPDK 和使用者空間驅動程式。
MANA DPDK 需要下列驅動程式集合:
- Linux 核心乙太網路驅動程式 (5.15 核心和更新版本)
- Linux 核心 InfiniBand 驅動程式 (6.2 核心和更新版本)
- DPDK MANA 輪詢模式驅動程式 (DPDK 22.11 和更新版本)
- Libmana 使用者空間驅動程式 (rdma 核心 v44 和更新版本)
支援的 Marketplace 映像
非詳盡的影像清單,包含使用 MANA 之 DPDK 的向後移植修補程式:
- 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)
注意
MANA DPDK 不適用於 Windows;其只適用於 Linux VM。
範例:檢查 MANA
注意
本文假設系統上已安裝 pciutils 套件 (包含 lspci 命令)。
# 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
範例:DPDK 安裝 (Ubuntu 22.04)
注意
本文假設系統上已安裝相容的核心和 rdma 核心。
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
範例:Testpmd 設定和 netvsc 測試
請注意下列使用 MANA 執行 DPDK 的範例程式碼。 建議在 Azure 上使用 direct-to-vf 'netvsc' 設定,以獲得 MANA 的最大效能。
注意
DPDK 需要啟用 2 MB 或 1 GB 的 Huge Pages。 範例假設已連結 2 個加速網路 NIC 的 Azure VM。
# 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
疑難排解
無法將介面設為關閉。
無法將 MANA 繫結裝置設為「關閉」,可能會導致低或零封包輸送量。 無法釋出裝置可能會導致與傳輸佇列相關的 EAL 錯誤訊息。
mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19
無法啟用 Huge Pages。
請嘗試啟用 Huge Pages,並確認 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
使用 --vdev="net_vdev_netvsc0,iface=eth1"
的低輸送量
不建議使用 net_failsafe
或 net_vdev_netvsc
輪詢模式驅動程式的容錯移轉設定,以確保在 Azure 上達到高效能。 具有 DPDK 20.11 版或更高版本的 netvsc 設定可能會提供更好結果。 為了獲得最佳效能,請確定 Linux 核心、rdma 核心和 DPDK 套件符合 DPDK 和 MANA 列出的需求。
rdma-core 的版本不符
rdma-core 和 linux 核心的不符情況隨時可能發生;當使用者從來源建置 dma-core、DPDK 和 Linux 核心的某種組合時,通常會發生不符情況。 這類型的版本不符情形可能導致 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
這可能是由於搭配較新版 rdma-core 使用的核心具有 mana_ib 的向後移植修補程式。 根本原因是核心 RDMA 驅動程式與使用者空間 rdma-core 程式庫之間的互動。
適用於 RDMA 的 Linux 核心 uapi 具有 RDMA 提供者識別碼的清單,在核心的向後移植版本中,此識別碼值可能與 rdma-core 程式庫中的版本不同。
{!NOTE} 範例程式碼片段來自 Ubuntu 5.150-1045 linux-azure 和 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
};
此不符情況會導致 MANA 提供者程式碼無法載入。 使用 gdb
追蹤 dpdk-testpmd
的執行,確認已載入 ERDMA 提供者,而不是 MANA 提供者。 MANA driver_id 對於核心和 rdma-core 必須一致。 MANA PMD 會在這些 ID 相符時正確載入。