Configurar o DPDK em uma máquina virtual Linux

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux que está se aproximando do status de Fim da Vida Útil (EOL). Por favor, considere o seu uso e planeje de acordo. Para obter mais informações, consulte as diretrizes de Fim da Vida Útil do CentOS.

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

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

O DPDK consiste em conjuntos de bibliotecas de espaço do usuário que fornecem 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 sondagem para placas de interface de rede.

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

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

Benefício

Pacotes mais altos por segundo (PPS): Ignorar o kernel e assumir o controle dos pacotes no espaço do usuário reduz a contagem de ciclos eliminando opções de contexto. Também melhora a taxa de pacotes processados por segundo nas máquinas virtuais Linux do Azure.

Versões mínimas dos sistemas operativos suportados

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

SO Linux Versão de 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+
CentOS 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-nuvem+

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

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

Suporte personalizado ao kernel

Para qualquer versão do kernel Linux que não esteja listada, consulte Patches para criar um kernel Linux ajustado ao Azure. Para mais informações, pode também contactar aznetdpdk@microsoft.com.

Suporte de região

Todas as regiões do Azure suportam DPDK.

Pré-requisitos

A rede acelerada deve ser habilitada em uma máquina virtual Linux. A máquina virtual deve ter pelo menos duas interfaces de rede, com uma interface para gerenciamento. Não é recomendável habilitar a rede acelerada na interface de gerenciamento. 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 de kernel RDMA corretos estão carregados. Eles podem ser mlx4_ib, mlx5_ib ou mana_ib dependendo do tamanho da VM.

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

Instalar dependências de compilação

RHEL7.5/CentOS 7.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. Faça o download do DPDK mais recente. A versão 22.11 LTS ou mais recente é recomendada para o Azure.

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

  3. Compilar com ninja -C builddir.

  4. Instale com DESTDIR=<output folder> ninja -C builddir installo .

Configurar o ambiente de tempo de execução

Depois de reiniciar, execute os seguintes comandos uma vez:

  1. Hugepages

    • Configure 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/hugeo .

    • Monte páginas enormes com mount -t hugetlbfs nodev /mnt/hugeo .

    • Verifique se páginas enormes estão reservadas com grep Huge /proc/meminfo.

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

    Nota

    Há uma maneira de modificar o arquivo grub para que enormes páginas sejam reservadas na inicialização, seguindo as instruções para o DPDK. As instruções estão na parte inferior da página. Quando você estiver usando uma máquina virtual Linux do Azure, modifique arquivos em /etc/config/grub.d para reservar páginas enormes em reinicializações.

  2. MAC & Endereços IP: Use ifconfig –a para visualizar o MAC e o endereço 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. As interfaces VF são executadas como interfaces subordinadas de interfaces NETVSC .

  3. Endereços PCI

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

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

  4. Carregue ibuverbs em cada reinicialização com modprobe -a ib_uverbs. Apenas para SLES 15, carregue também mlx4_ib com modprobe -a mlx4_ib.

Mestre PMD

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

NetVSC PMD

NetVSC é o PMD recomendado para ser executado como um PMD mestre no Azure. Ele garante que o aplicativo recebe 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 VF seja revogado quando o host estiver sendo atendido. 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 a sua versão do DPDK for 22.11 LTS ou mais recente, recomenda-se o uso do NetVSC PMD.

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

Executar testpmd

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

Básico: verificação de sanidade, 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 da porta. Você deve ver uma ou duas portas DPDK que estão net_netvsc.

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

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

Básico: Emissor único/recetor único

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

  1. No lado 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 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>
    

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

Avançado: Remetente único/encaminhador único

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

  1. No lado 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 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>
    

Quando você estiver executando os comandos anteriores em uma máquina virtual, altere IP_SRC_ADDR e IP_DST_ADDR para corresponder app/test-pmd/txonly.c ao endereço IP real das máquinas virtuais antes de compilar. Caso contrário, os pacotes são descartados antes de chegar ao encaminhador. Você não pode fazer com que uma terceira máquina receba tráfego encaminhado, porque o encaminhador testpmd não modifica os endereços de camada 3, a menos que você faça algumas alterações de código.

sudo yum install -y dpdk

Referências