Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сетевой адаптер Microsoft Azure (MANA) — это новое оборудование для Azure виртуальных машин, что обеспечивает более высокую пропускную способность и надежность. Чтобы использовать MANA, пользователи должны изменить свои подпрограммы инициализации DPDK. MANA требует двух изменений по сравнению с устаревшим оборудованием:
- Аргументы MANA EAL для драйвера режима опроса (PMD) отличаются по сравнению с предыдущим оборудованием.
- Ядро Linux должно освободить управление сетевыми интерфейсами MANA перед началом инициализации DPDK.
Процедура установки для MANA DPDK описана в примере кода..
Введение
Устаревшие Azure виртуальные машины Linux используют драйверы mlx4 или mlx5 и сопровождающее оборудование для ускорения сети. Пользователи DPDK в Azure выбирают определенные интерфейсы для включения или исключения путем передачи адресов шины в DPDK EAL. Процедура установки для MANA DPDK немного отличается, так как предположение одного адреса шины на интерфейс ускоренной сети больше не является верным. Вместо использования адреса шины PCI, MANA PMD использует MAC-адрес для определения интерфейса, к которому он должен привязаться.
Аргументы MANA DPDK EAL
MANA PMD проверяет все устройства и порты в системе при отсутствии аргумента --vdev; аргумент --vdev не является обязательным. В средах тестирования часто желательно оставить один (основной) интерфейс доступным для обслуживания подключения SSH к виртуальной машине. Чтобы использовать DPDK с подмножеством доступных виртуальных машин, пользователи должны передать как адрес шины устройства MANA, так и MAC-адрес интерфейсов в аргументе --vdev . Дополнительные сведения см. в примере кода для демонстрации инициализации EAL DPDK в MANA.
Общие сведения об уровне абстракции среды DPDK (EAL):
Требования DPDK для MANA
Поддержка ядра
Для работы DPDK на оборудовании MANA требуется ядро Linux 6.14 или более поздней версии или бэкпорт драйверов Ethernet и InfiniBand из этого же ядра. Для нее также требуются определенные версии DPDK и драйверов пространства пользователя. ДЛЯ MANA DPDK требуется следующий набор драйверов:
- Драйвер режима опроса DPDK MANA (последние 3 стабильных выпуска)
- Драйверы пользовательского пространства Libmana (rdma-core версии 44 и позднее)
Примечание.
DPDK официально поддерживает последние три стабильных выпуска драйвера. Клиентам с более старой версией DPDK необходимо выполнить обратный перенос всех исправлений MANA из одного из поддерживаемых стабильных выпусков.
Примечание.
MANA DPDK недоступна для Windows; она будет работать только на виртуальных машинах Linux.
Поддерживаемые образы торговой площадки
Полный список поддерживаемых образов Marketplace можно найти в статье 'Обзор ускоренной сети Azure'.
Пример: Проверка для 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 с двумя ускоренными сетевыми интерфейсами.
# 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 Kernel могут возникать в любое время; часто они возникают, когда пользователь собирает некоторую комбинацию rdma-core, DPDK и Linux Kernel из исходных текстов. Такой тип несоответствия версий может привести к сбою проверки виртуальной функции 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. Идентификатор MANA driver_id должен быть согласован как с ядром, так и с rdma-core. MANA PMD загружается правильно, когда эти идентификаторы соответствуют.