Сетевой адаптер Microsoft Azure (MANA) и DPDK в Linux
Сетевой адаптер Microsoft Azure (MANA) — это новое оборудование для виртуальных машин Azure, позволяющее повысить пропускную способность и надежность. Чтобы использовать MANA, пользователи должны изменить свои подпрограммы инициализации DPDK. MANA требует двух изменений по сравнению с устаревшим оборудованием:
- Аргументы MANA EAL для драйвера в режиме опроса (PMD) отличаются от предыдущего оборудования.
- Ядро Linux должно освободить управление сетевыми интерфейсами MANA перед началом инициализации DPDK.
Процедура установки для MANA DPDK описана в примере кода..
Введение
Устаревшие виртуальные машины Linux Azure используют драйверы mlx4 или mlx5 и сопутствующие оборудование для ускорения сети. Пользователи AZURE DPDK будут выбирать определенные интерфейсы для включения или исключения путем передачи адресов шины в EAL DPDK. Процедура установки ДЛЯ MANA DPDK немного отличается, так как предположение одного адреса шины на интерфейс ускорения сети больше не имеет значения true. Вместо использования адреса шины PCI, MANA PMD использует MAC-адрес для определения интерфейса, к которому он должен привязаться.
Аргументы EAL DPDK MANA
MANA PMD проверяет все устройства и порты в системе, если аргумент отсутствует --vdev
. --vdev
Аргумент не является обязательным. В средах тестирования часто желательно оставить один (основной) интерфейс доступным для обслуживания подключения SSH к виртуальной машине. Чтобы использовать DPDK с подмножеством доступных виртуальных машин, пользователи должны передать как адрес шины устройства MANA, так и MAC-адрес интерфейсов в аргументе --vdev
. Дополнительные сведения см. в примере кода для демонстрации инициализации EAL DPDK в MANA.
Общие сведения об уровне абстракции среды DPDK (EAL):
Требования DPDK для MANA
Для использования DPDK на оборудовании MANA требуется ядро Linux 6.2 или более поздней версии или серверная часть драйверов Ethernet и InfiniBand из последнего ядра Linux. Для нее также требуются определенные версии DPDK и драйверов пространства пользователя.
ДЛЯ MANA DPDK требуется следующий набор драйверов:
- Драйвер Ethernet ядра Linux (ядро 5.15 и более поздние версии)
- Драйвер InfiniBand ядра Linux (ядро 6.2 и более поздние версии)
- Драйвер режима опроса DPDK MANA (DPDK 22.11 и более поздние версии)
- Драйверы пространства пользователей Libmana (rdma-core версии 44 и более поздних версий)
Поддерживаемые образы Marketplace
Неисчерпаемый список изображений с резервными исправлениями для DPDK с MANA:
- Red Hat Enterprise Linux 8.9
- Red Hat Enterprise Linux 9.4
- Канонический Ubuntu Server 20.04 (5.15.0-1045-azure)
- Канонический Ubuntu Server 22.04 (5.15.0-1045-azure)
Примечание.
MANA DPDK недоступна для Windows; Он будет работать только на виртуальных машинах Linux.
Пример. Проверка для 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-core.
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
Обратите внимание на следующий пример кода для запуска DPDK с ПОМОЩЬЮ MANA. Конфигурация direct-to-vf "netvsc" в Azure рекомендуется для максимальной производительности с помощью MANA.
Примечание.
DPDK требует включения 2 МБ или 1 ГБ огромных страниц. В примере предполагается, что виртуальная машина Azure с подключенными сетевыми адаптерами с 2 ускоренными сетевыми адаптерами.
# 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, к DOWN, может привести к низкой или нулевой пропускной способности пакетов. Сбой освобождения устройства может привести к сообщению об ошибке EAL, связанному с передачей очередей.
mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19
Сбой включения огромных страниц.
Попробуйте включить огромные страницы и убедиться, что информация отображается в 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. Конфигурация netvsc с DPDK версии 20.11 или выше может дать лучшие результаты. Для оптимальной производительности убедитесь, что пакеты Ядра Linux, rdma-core и DPDK соответствуют перечисленным требованиям для DPDK и MANA.
Несоответствие версий для rdma-core
Несоответствия в rdma-core и ядро Linux могут возникать в любое время; часто они возникают, когда пользователь создает некоторую комбинацию rdma-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
Это, вероятно, приводит к использованию ядра с резервными исправлениями для mana_ib с более новой версией rdma-core. Первопричиной является взаимодействие между драйверами RDMA ядра и библиотеками rdma-core.
Ядро Linux uapi для RDMA содержит список идентификаторов поставщика RDMA, в поддерживаемых версиях ядра этот идентификатор может отличаться от версии в библиотеках rdma-core.
{! ПРИМЕЧАНИЕ} Примеры фрагментов кода из Ubuntu 5.150-1045 linux-azure и rdma-core версии 46.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. Driver_id MANA должен быть согласован как для ядра, так и для ядра rdma-core. MANA PMD загружается правильно, когда эти идентификаторы соответствуют.