Partilhar via


Microsoft Azure Network Adapter (MANA) e DPDK no Linux

O adaptador de rede do Microsoft Azure (MANA) é um novo equipamento para máquinas virtuais da Azure que oferece maior largura de banda e fiabilidade. Para utilizar o MANA, os utilizadores devem modificar as suas rotinas de inicialização DPDK. O MANA requer duas alterações em comparação com o hardware legado:

  • Os argumentos MANA EAL para o driver em modo de sondagem (PMD) são diferentes do hardware anterior.
  • O kernel Linux deve libertar o controlo das interfaces de rede MANA antes de começar a inicialização do DPDK.

O procedimento de configuração do MANA DPDK está descrito no código de exemplo..

Introduction

As VMs Azure Linux legadas dependem dos drivers mlx4 ou mlx5 e do hardware correspondente para redes aceleradas. Os utilizadores do Azure DPDK selecionariam interfaces específicas para incluir ou excluir, transmitindo endereços de barramento para o DPDK EAL. O procedimento de configuração para o MANA DPDK difere ligeiramente, uma vez que a suposição de um endereço de barramento por interface de Rede Acelerada já não é válida. Em vez de usar um endereço de barramento PCI, o PMD MANA usa o endereço MAC para determinar a que interface deve ligar-se.

ARGUMENTOS DO MANA DPDK EAL

O PMD MANA sonda todos os dispositivos e portas do sistema quando não há --vdev argumento presente; --vdev argumento não é obrigatório. Em ambientes de teste, é frequentemente desejável deixar uma interface (primária) disponível para servir a ligação SSH à VM. Para usar DPDK com um subconjunto dos VFs disponíveis, os utilizadores devem passar tanto o endereço do barramento do dispositivo MANA como o endereço MAC das interfaces no argumento --vdev. Para mais detalhes, está disponível código de exemplo para demonstrar a inicialização DPDK EAL no MANA.

Para informações gerais sobre a Camada de Abstração do Ambiente (EAL) DPDK:

Requisitos DPDK para MANA

Suporte ao kernel

Executar DPDK em hardware MANA requer o kernel Linux 6.14 ou posterior, ou um backport dos drivers Ethernet e InfiniBand do kernel Linux 6.14 ou posterior. Também requer versões específicas de DPDK e drivers de espaço de utilizador. O MANA DDK requer o seguinte conjunto de drivers:

  • Driver DPDK MANA em modo de sondagem (Os últimos 3 lançamentos estáveis)
  • Drivers de espaço de utilizador Libmana (rdma-core v44 e posteriores)

Nota

O DPDK suporta oficialmente as últimas três versões de drivers estáveis. Os clientes com versões antigas do DPDK precisam de retroportar todos os patches MANA a partir de uma versão estável suportada.

Nota

O MANA DPDK não está disponível para Windows; só funciona em VMs Linux.

Imagens do Marketplace suportadas

Uma lista completa de imagens de mercado suportadas pode ser encontrada na visão geral de 'Azure Accelerated Networking'.

Exemplo: Verificar MANA

Nota

Este artigo assume que o pacote pciutils contendo o comando lspci está instalado no sistema.

# 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

Exemplo: instalação DPDK (Ubuntu 22.04)

Nota

Este artigo assume que um kernel compatível e o rdma-core estão instalados no 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

Exemplo: Configuração do testpmd e teste netvsc

Note o seguinte exemplo de código para correr DPDK com MANA. Recomenda-se a configuração direct-to-vf 'netvsc' no Azure para máximo desempenho com MANA.

Nota

DPDK requer que páginas enormes de 2MB ou 1GB estejam ativadas. O exemplo assume uma VM Azure com 2 NICs de rede aceleradas ligadas.

# 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

Resolução de Problemas

Falha ao tentar desligar a interface.

A falha em definir o dispositivo associado ao MANA para DOWN pode resultar em baixa ou nula transmissão de pacotes. A falha em libertar o dispositivo pode resultar numa mensagem de erro EAL relacionada com filas de transmissão.

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

Falha em ativar páginas gigantes.

Tente ativar páginas grandes e garantir que a informação é visível no 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

Baixo débito com uso de --vdev="net_vdev_netvsc0,iface=eth1"

A configuração de failover dos drivers de modo de sondagem net_failsafe ou net_vdev_netvsc não é recomendada para alto desempenho em Azure. A configuração netvsc com DPDK versão 20.11 ou superior pode dar melhores resultados. Para um desempenho ótimo, certifique-se de que o seu kernel Linux, rdma-core e pacotes DPDK cumprem os requisitos listados para DPDK e MANA.

Incompatibilidade de versão para rdma-core

Podem ocorrer incompatibilidades no rdma-core e no kernel do linux a qualquer momento; frequentemente ocorrem quando um utilizador está a construir uma combinação de RDMA-Core, DPDK e o kernel Linux a partir da fonte. Este tipo de incompatibilidade de versões pode causar uma falha na verificação da função virtual (VF) MANA.

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

Isto provavelmente resulta da utilização de um kernel com patches retroportados para mana_ib com uma versão mais recente do rdma-core. A causa raiz é uma interação entre os drivers RDMA do kernel e as bibliotecas rdma-core do espaço de utilizador.

O kernel Linux uapi para RDMA tem uma lista de IDs de fornecedores RDMA; nas versões retroportadas do kernel, este valor de ID pode diferir da versão das bibliotecas rdma-core.

{! NOTA} Exemplos de excertos são do Ubuntu 5.150-1045 linux-azure e rdma-core v46.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
};

Esta incompatibilidade faz com que o código do fornecedor MANA não carregue. Use gdb para rastrear a execução de dpdk-testpmd e confirmar que o provider ERDMA está carregado em vez do provider MANA. O MANA driver_id deve ser consistente tanto para o kernel como para o rdma-core. O PMD MANA carrega corretamente quando esses IDs coincidem.