Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сетевой адаптер Microsoft Azure (MANA) — это новое оборудование для виртуальных машин Azure, позволяющее повысить пропускную способность и надежность. Чтобы использовать MANA, пользователи должны изменить свои подпрограммы инициализации DPDK. MANA требует двух изменений по сравнению с устаревшим оборудованием:
- Аргументы MANA EAL для драйвера режима опроса (PMD) отличаются по сравнению с предыдущим оборудованием.
- Ядро Linux должно освободить управление сетевыми интерфейсами MANA перед началом инициализации DPDK.
Процедура установки для MANA DPDK описана в примере кода..
Введение
Устаревшие виртуальные машины Linux Azure используют драйверы mlx4 или mlx5 и сопутствующие оборудование для ускорения сети. Пользователи Azure DPDK выбирают определенные интерфейсы для включения или исключения, передавая адреса шины в 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.2 или более поздней, или задействование обратного порта драйверов Ethernet и InfiniBand из последнего ядра Linux. Для нее также требуются определенные версии DPDK и драйверов пространства пользователя.
ДЛЯ MANA DPDK требуется следующий набор драйверов:
- Драйвер Ethernet ядра Linux (ядро 5.15 и более поздние версии)
- Драйвер InfiniBand для ядра Linux (версии ядра 6.2 и более поздние)
- Драйвер режима опроса DPDK MANA (DPDK 22.11 и более поздние версии)
- Драйверы пользовательского пространства Libmana (rdma-core версии 44 и более поздние)
Поддерживаемые образы торговой площадки
Неисчерпаемый список изображений с резервными исправлениями для DPDK с 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)
Примечание.
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 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 загружается правильно, когда эти идентификаторы соответствуют.