Configurar o DPDK em uma máquina virtual Linux

O Data Plane Development Kit (DPDK) no Azure oferece uma estrutura de processamento de pacotes de espaço do usuário mais rápida para aplicativos que exigem muito desempenho. Essa estrutura ignora a pilha de rede da máquina virtual do kernel.

No processamento de pacote típico que usa a pilha de rede do kernel, o processo é controlado por interrupção. Quando o adaptador de rede recebe pacotes de entrada, há uma interrupção do kernel para processar o pacote e uma alternância de contexto do espaço do kernel para o espaço do usuário. O DPDK elimina a alternância de contexto e o método acionado por interrupção em favor de uma implementação de espaço do usuário que usa drivers de modo de pesquisa para processamento rápido de pacotes.

O DPDK consiste em um conjunto de bibliotecas de espaço de usuário que fornece acesso a recursos de nível inferior. Esses recursos podem incluir hardware, núcleos lógicos, gerenciamento de memória e drivers de modo de pesquisa para placas de interface de rede.

O DPDK pode ser executado em máquinas virtuais do Azure, com suporte a várias distribuições do sistema operacional. O DPDK fornece uma diferenciação de desempenho chave na condução de implementações de virtualização de funções de rede. Essas implementações podem assumir a forma de NVA (dispositivos virtuais de rede), como roteadores virtuais, firewalls, VPNs, balanceadores de carga, núcleos de pacotes evoluídos e aplicativos de DDoS (negação de serviço).

Uma lista de instruções de instalação para DPDK em VMs MANA está disponível aqui: Adaptador de Rede do Microsoft Azure (MANA) e DPDK no Linux

Benefício

Mais pacotes por segundo (PPS) : ignorar o kernel e controlar os pacotes no espaço do usuário reduz a contagem de ciclos através da eliminação de alternância de contexto. Ele também melhora a taxa de pacotes que são processados por segundo nas máquinas virtuais do Azure Linux.

Versões mínimas dos sistemas operacionais suportados

As seguintes distribuições do Azure Marketplace são suportadas:

Sistema operacional Linux Versão do kernel
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

As versões citadas são os requisitos mínimos. Versões mais recentes também são suportadas.

Uma lista de requisitos para DPDK em VMs MANA está disponível aqui: Adaptador de Rede do Microsoft Azure (MANA) e DPDK no Linux

Suporte a kernel personalizado

Para qualquer versão do kernel Linux que não esteja listada, confira Patches para a criação de um kernel do Linux ajustado para o Azure. Para mais informações, você também pode entrar em contato com aznetdpdk@microsoft.com.

Suporte de regiões

Todas as regiões do Azure dão suporte a DPDK.

Pré-requisitos

A rede acelerada deve ser habilitada em uma máquina virtual Linux. A máquina virtual deve ter pelo menos dois adaptadores de rede, com uma interface de gerenciamento. Habilitar a Rede acelerada na interface de gerenciamento não é recomendado. Saiba como criar uma máquina virtual Linux com rede acelerada habilitada.

Além disso, o DPDK usa verbos RDMA para criar filas de dados no Adaptador de Rede. Na VM, verifique se os drivers do kernel RDMA corretos foram carregados. Eles podem ser mlx4_ib, mlx5_ib ou mana_ib, dependendo dos tamanhos da VM.

As instruções de instalação do DPDK para VMs MANA estão disponíveis aqui: Adaptador de Rede do Microsoft Azure (MANA) e DPDK no Linux

Instalar dependências de compilação

RHEL7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

Compilar e instalar o DPDK manualmente

  1. Baixar a mais recente DPDK. A versão 22.11 LTS ou mais recente é recomendada para o Azure.

  2. Crie a configuração padrão com meson builddir.

  3. Compilar com ninja -C builddir.

  4. Instalar com DESTDIR=<output folder> ninja -C builddir install.

Configurar o ambiente de runtime

Depois de reiniciar, execute os comandos a seguir, uma vez:

  1. Hugepages

    • Configure a hugepage executando o seguinte comando, uma vez para cada nó NUMA:
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • Crie um diretório para montagem com mkdir /mnt/huge.

    • Monte as hugepages com mount -t hugetlbfs nodev /mnt/huge.

    • Verifique se hugepages estão reservados com grep Huge /proc/meminfo.

    • O exemplo acima é para 2 milhões de páginas enormes. Páginas enormes de 1G também podem ser usadas.

    Observação

    Existe uma maneira de modificar o arquivo grub para que as páginas grandes sejam reservadas na inicialização seguindo as instruções para o DPDK. As instruções estão na parte inferior da página. Ao usar uma máquina virtual do Azure Linux, modifique os arquivos em /etc/config/grub.d para reservar páginas amplas nas reinicializações.

  2. Endereços MAC e IP: use ifconfig –a para visualizar o endereço MAC e IP das interfaces de rede. A interface de rede VF e a interface de rede NETVSC têm o mesmo endereço MAC, mas apenas a interface de rede NETVSC tem um endereço IP. Interfaces de VF estão em execução como interfaces subordinadas de interfaces NETVSC.

  3. Endereços PCI

    • Use ethtool -i <vf interface name> para descobrir qual endereço PCI usar para ethtool -i <vf interface name>.

    • Se eth0 tem rede acelerada habilitada, garanta que testpmd não assuma acidentalmente o controle do dispositivo VF de pci para eth0. Se o aplicativo DPDK acidentalmente assumir a interface de rede de gerenciamento e fizer com que você perca a conexão SSH, use o console serial para interromper o aplicativo DPDK. Você também pode usar o console serial para interromper ou iniciar a máquina virtual.

  4. Carga ibuverbs em cada reinicialização com modprobe -a ib_uverbs. Para apenas 15 SLES, também carrega mlx4_ib com modprobe -a mlx4_ib.

PMD mestre

Os aplicativos DPDK devem ser executados sobre o PMD mestre que está exposto no Azure. Se o aplicativo for executado diretamente sobre o PMD de VF, ele não receberá todos os pacotes destinados à VM, pois alguns pacotes aparecem na interface sintética. O DPDK suporta dois tipos de PMDs mestres: NetVSC PMD e PMD à prova de falhas. Um PMD mestre garante que o aplicativo receba todos os pacotes que são destinados a ele. Ele também garante que o aplicativo continue sendo executado no modo DPDK no PMD mestre, mesmo que o VF seja revogado quando o host estiver sendo atendido.

PMD NetVSC

NetVSC é o PMD recomendado para ser executado como um PMD mestre no Azure. Ele garante que o aplicativo receba todos os pacotes que são destinados a ele. Ele também garante que o aplicativo continue em execução no modo DPDK, mesmo que o FV seja revogado quando o host estiver em manutenção. Para obter mais informações sobre como usar e configurar o NetVSC PMD, consulte (https://doc.dpdk.org/guides/nics/netvsc.html).

PMD à prova de falhas

Observação: a execução com PMD à prova de falhas não é recomendada no Azure. Se sua versão do DPDK for 22.11 LTS ou mais recente, é recomendável usar o NetVSC PMD.

Alternativamente, você pode executar um aplicativo DPDK sobre o PMD à prova de falhas. Para obter mais informações sobre o PMD à prova de falhas, consulte Biblioteca de drivers do modo de pesquisa à prova de falhas.

Executar testpmd

Para executar testpmd no modo de raiz, use sudo antes do comando sudo.

Básico: verificação de integridade, inicialização do adaptador à prova de falhas

  1. Execute os seguintes comandos para iniciar um aplicativo testpmd de porta única:

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. Execute os seguintes comandos para iniciar um aplicativo testpmd de porta dupla:

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

Depois de iniciado, execute show port info all para verificar as informações de porta. Você deverá ver uma ou duas portas DPDK que são net_netvsc.

  1. Use start <port> /stop <port> para iniciar o tráfego.

Os comandos anteriores iniciam testpmd no modo interativo, o que é recomendado, para testar alguns comandos testpmd.

Básico: remetente único/receptor único

Os seguintes comandos periodicamente imprimem as estatísticas de pacotes por segundo:

  1. No lado do TX, execute o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. No lado do RX, execute o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Ao executar os comandos anteriores em uma máquina virtual, altere IP_SRC_ADDR e IP_DST_ADDR em app/test-pmd/txonly.c para corresponder ao endereço IP real das máquinas virtuais antes de compilar. Caso contrário, os pacotes são descartados antes de chegar ao receptor.

Avançado: Remetente único/encaminhador único

Os seguintes comandos periodicamente imprimem as estatísticas de pacotes por segundo:

  1. No lado do TX, execute o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. No lado do FWD, execute o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Ao executar os comandos anteriores em uma máquina virtual, altere IP_SRC_ADDR e IP_DST_ADDR em app/test-pmd/txonly.c para corresponder ao endereço IP real das máquinas virtuais antes de compilar. Caso contrário, os pacotes são descartados antes de alcançar o encaminhador. Não é possível que um terceiro computador receba o tráfego encaminhado porque o encaminhador testpmd não modifica os endereços da camada 3, a menos que você faça algumas alterações no código.

sudo yum install -y dpdk

Referências