Поделиться через


Сетевой адаптер 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 выбирают определенные интерфейсы для включения или исключения путем передачи адресов шины в DPDK EAL. Процедура настройки ДЛЯ MANA DPDK немного отличается, так как предположение об одном адресе шины для каждого интерфейса ускоренной сети больше не является верным. Вместо того чтобы использовать адрес шины PCI, PMD MANA использует MAC-адрес, чтобы определить, к какому интерфейсу она должна привязаться.

Аргументы EAL МАНА DPDK

MANA PMD проверяет все устройства и порты в системе, если аргумент отсутствует --vdev . --vdev Аргумент не является обязательным. В средах тестирования часто желательно оставить один (основной) интерфейс для обслуживания SSH-подключения к виртуальной машине. Чтобы использовать DPDK с подмножеством доступных виртуальных машин, пользователи должны передать адрес шины устройства MANA и MAC-адрес интерфейсов в аргументе --vdev . Дополнительные сведения см. в примере кода для демонстрации инициализации DPDK EAL в MANA.

Общие сведения о слое абстракции среды DPDK (EAL):

Требования DPDK для MANA

Для использования DPDK на оборудовании MANA требуется ядро Linux версии 6.2 или более поздней версии или задний порт драйверов Ethernet и InfiniBand из ядра Linux последней версии. Для этого также требуются определенные версии DPDK и драйверов пользовательского пространства.

ДЛЯ MANA DPDK требуется следующий набор драйверов:

  1. Драйвер Ethernet ядра Linux (ядро 5.15 и более поздние версии)
  2. Драйвер InfiniBand ядра Linux (ядро 6.2 и более поздние версии)
  3. Драйвер DPDK MANA в режиме опроса (DPDK 22.11 и более поздние версии)
  4. Драйверы пространства пользователя Libmana (rdma-core версии 44 и более поздних версий)

Примечание

MANA DPDK недоступен для Windows; он будет работать только на виртуальных машинах Linux.

Пример. Проверка на наличие MANA

Примечание

В этой статье предполагается, что в системе установлен пакет pciutils, содержащий команду lspci.

# check for pci devices with ID:
#   vendor: Microsoft Corporation (1414)
#   class:  Ethernet Controller (0200)
#   device: Microsft 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. Для максимальной производительности с помощью MANA рекомендуется использовать конфигурацию "netvsc" напрямую в vf в Azure.

Примечание

ДЛЯ DPDK требуется включить огромные страницы объемом 2 МБ или 1 ГБ.

# 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-9 --vdev="$BUS_INFO,mac=$MANA_MAC" -- --forward-mode=txonly --auto-start --nb-cores=8  --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 poll-mode не рекомендуется для высокой производительности в Azure. Конфигурация netvsc с DPDK версии 20.11 или более поздней может дать лучшие результаты. Для обеспечения оптимальной производительности убедитесь, что пакеты ядра Linux, rdma-core и DPDK соответствуют перечисленным требованиям для DPDK и MANA.