Compartir a través de


Adaptador de red de Microsoft Azure (MANA) y DPDK en Linux

El adaptador de red de Microsoft Azure (MANA) es un nuevo hardware para máquinas virtuales Azure que permite un mayor rendimiento y confiabilidad. Para usar MANA, los usuarios deben modificar sus rutinas de inicialización del DPDK. MANA requiere dos cambios en comparación con el hardware heredado:

  • Los argumentos EAL de MANA para el controlador en modo de sondeo (PMD) difieren del hardware anterior.
  • El kernel de Linux debe liberar el control de las interfaces de red MANA antes de que comience la inicialización del DPDK.

El procedimiento de configuración del DPDK de MANA se describe en el código de ejemplo.

Introducción

Las máquinas virtuales de Linux de Azure heredadas se basan en los controladores mlx4 o mlx5 y el hardware adjunto para redes aceleradas. Los usuarios del DPDK de Azure seleccionarían interfaces específicas para incluir o excluir pasando direcciones de bus al EAL del DPDK. El procedimiento de configuración del DPDK de MANA difiere ligeramente, ya que la suposición de una dirección de bus por interfaz de redes aceleradas ya no es verdadera. En lugar de usar una dirección de bus PCI, el PMD de MANA usa la dirección MAC para determinar a qué interfaz se debe enlazar.

Argumentos de EAL del DPDK de MANA

EL PMD de MANA sondea todos los dispositivos y puertos del sistema cuando no hay ningún argumento --vdev; el argumento --vdev no es obligatorio. En entornos de prueba, a menudo es conveniente dejar una interfaz (principal) disponible para mantener la conexión SSH con la máquina virtual. Para usar el DPDK con un subconjunto de las máquinas virtuales disponibles, los usuarios deben pasar la dirección de bus del dispositivo MANA y la dirección MAC de las interfaces en el argumento --vdev. Para obtener más información, el código de ejemplo está disponible para demostrar la inicialización del EAL del DPDK en MANA.

Para obtener información general sobre la capa de abstracción del entorno (EAL) del DPDK:

Requisitos del DPDK para MANA

El uso de DPDK en hardware MANA requiere el kernel de Linux 6.2 o posterior o una ventanilla posterior de los controladores Ethernet e InfiniBand del kernel de Linux más reciente. También requiere versiones específicas de DPDK y controladores de espacio de usuario.

El DPDK de MANA requiere el siguiente conjunto de controladores:

  1. Controlador Ethernet del kernel de Linux (kernel 5.15 y versiones posteriores)
  2. Controlador InfiniBand del kernel de Linux (kernel 6.2 y versiones posteriores)
  3. Controlador en modo de sondeo DPDK MANA (DPDK 22.11 y versiones posteriores)
  4. Controladores de espacio de usuario de Libmana (rdma-core v44 y versiones posteriores)

Nota:

El DPDK de MANA no está disponible para Windows; solo funcionará en máquinas virtuales Linux.

Ejemplo: comprobar la presencia de MANA

Nota:

En este artículo se supone que el paquete pciutils que contiene el comando lspci está instalado en el sistema.

# 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

Ejemplo: instalación del DPDK (Ubuntu 22.04)

Nota:

En este artículo se da por supuesto que el kernel compatible y rdma-core están instalados en el sistema.

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

Ejemplo: configuración de testpmd y prueba de netvsc

Tenga en cuenta el código de ejemplo siguiente para ejecutar el DPDK con MANA. Se recomienda la configuración "netvsc" directa a vf en Azure para obtener el máximo rendimiento con MANA.

Nota:

El DPDK requiere que se habiliten páginas enormes 2 MB o 1 GB

# 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

Solución de problemas

No se puede establecer la interfaz fuera de servicio.

Si no se configura el dispositivo enlazado a MANA en DOWN, se puede producir un rendimiento de paquetes bajo o igual a cero. El error al liberar el dispositivo puede dar lugar al mensaje de error EAL relacionado con las colas de transmisión.

mana_start_tx_queues(): Failed to create qp queue index 0
mana_dev_start(): failed to start tx queues -19

Error al habilitar páginas enormes.

Intente habilitar páginas enormes y asegurarse de que la información sea visible en 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

Rendimiento bajo con el uso de --vdev="net_vdev_netvsc0,iface=eth1"

La configuración de conmutación por error de los controladores en modo de sondeo net_failsafe o net_vdev_netvsc no se recomienda para un alto rendimiento en Azure. La configuración de netvsc con el DPDK versión 20.11 o posterior puede dar mejores resultados. Para obtener un rendimiento óptimo, asegúrese de que los paquetes del kernel de Linux, rdma-core y DPDK cumplen los requisitos enumerados para el DPDK y MANA.