Configurar o DPDK numa máquina virtual Linux

O Data Plane Development Kit (DPDK) em Azure oferece uma estrutura de processamento de pacotes de espaço de utilizador mais rápida para aplicações intensivas de desempenho. Esta estrutura contorna a pilha de rede de núcleos da máquina virtual.

No processamento típico de pacotes que utiliza a pilha de rede de núcleo, o processo é interrompido. Quando a interface de rede recebe pacotes de entrada, há uma interrupção de kernel para processar o pacote e um interruptor de contexto do espaço do núcleo para o espaço do utilizador. A DPDK elimina a comutação de contexto e o método orientado por interrupção a favor de uma implementação do espaço de utilizador que utiliza os controladores do modo de votação para o processamento rápido de pacotes.

A DPDK consiste em conjuntos de bibliotecas espaciais de utilizador que fornecem acesso a recursos de nível inferior. Estes recursos podem incluir hardware, núcleos lógicos, gestão de memória e controladores de modo de pesquisa para cartões de interface de rede.

A DPDK pode funcionar em máquinas virtuais Azure que suportam múltiplas distribuições de sistemas operativos. A DPDK fornece uma diferenciação de desempenho chave nas implementações de virtualização da função de condução da rede. Estas implementações podem assumir a forma de aparelhos virtuais de rede (NVAs), tais como routers virtuais, firewalls, VPNs, equilibradores de carga, núcleos de pacotes evoluídos e aplicações de negação de serviço (DDoS).

Vantagem

Pacotes mais altos por segundo (PPS): Contornar o núcleo e assumir o controlo dos pacotes no espaço do utilizador reduz a contagem de ciclos eliminando os interruptores de contexto. Também melhora a taxa de pacotes que são processados por segundo em máquinas virtuais Azure Linux.

Versões mínimas dos sistemas operativos suportados

São suportadas as seguintes distribuições do Mercado Azure:

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-cloud+

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

Suporte personalizado para kernel

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

Suporte de região

Todas as regiões de Azure apoiam a DPDK.

Pré-requisitos

A ligação acelerada em rede deve ser ativada numa máquina virtual Linux. A máquina virtual deve ter pelo menos duas interfaces de rede, com uma interface para gestão. Não é aconselhável permitir a ligação acelerada da rede na interface de gestão. Saiba como criar uma máquina virtual Linux com rede acelerada ativada.

Nas máquinas virtuais que utilizam a InfiniBand, certifique-se de que os condutores apropriados mlx4_ib ou mlx5_ib os condutores estão carregados, consulte Enable InfiniBand.

Ubuntu 18.04

sudo add-apt-repository ppa:canonical-server/server-backports -y
sudo apt-get update
sudo apt-get install -y dpdk

Ubuntu 20.04 e mais recente

sudo apt-get install -y dpdk

Debian 10 e mais novo

sudo apt-get install -y dpdk

Instalar dependências de construção

Ubuntu 18.04

sudo add-apt-repository ppa:canonical-server/server-backports -y
sudo apt-get update
sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

Ubuntu 20.04 e mais recente

sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

Debian 10 e mais novo

sudo apt-get install -y build-essential librdmacm-dev libnuma-dev libmnl-dev meson

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

SLES 15 SP1

Núcleo de Azure

zypper  \
  --no-gpg-checks \
  --non-interactive \
  --gpg-auto-import-keys install kernel-azure kernel-devel-azure gcc make libnuma-devel numactl librdmacm1 rdma-core-devel meson

Kernel padrão

zypper \
  --no-gpg-checks \
  --non-interactive \
  --gpg-auto-import-keys install kernel-default-devel gcc make libnuma-devel numactl librdmacm1 rdma-core-devel meson

Compilar e instalar o DPDK manualmente

  1. Descarregue o mais recente DPDK. A versão 19.11 LTS ou mais recente é necessária para o Azure.
  2. Construa o config padrão com meson builddir.
  3. Compilar com ninja -C builddir.
  4. Instale com DESTDIR=<output folder> ninja -C builddir install.

Configure o ambiente de tempo de execução

Depois de reiniciar, executar os seguintes comandos uma vez:

  1. Páginas enormes

    • Configure uma enorme página 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 enormes páginas com mount -t hugetlbfs nodev /mnt/huge.

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

      [NOTA] Existe uma maneira de modificar o ficheiro de comida para que as páginas enormes sejam reservadas no arranque seguindo as instruções para o DPDK. As instruções estão na parte inferior da página. Quando estiver a utilizar uma máquina virtual Azure Linux, modifique ficheiros em /etc/config/grub.d , para reservar grandes páginas através de reboots.

  2. Endereços IP MAC & : Utilize 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. As interfaces VF estão a funcionar como interfaces subordinadas das interfaces NETVSC.

  3. Endereços PCI

    • Utilize ethtool -i <vf interface name> para saber qual o endereço PCI a utilizar para VF.
    • Se a Eth0 tiver ativado a ligação em rede acelerada, certifique-se de que o testpmd não assume acidentalmente o dispositivo PCI VF para o eth0. Se a aplicação DPDK assumir acidentalmente a interface da rede de gestão e fizer com que perca a sua ligação SSH, utilize a consola em série para parar a aplicação DPDK. Também pode utilizar a consola em série 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.

PMD de segurança de falhas

As aplicações DPDK devem passar por cima do PMD de segurança que está exposto em Azure. Se a aplicação correr diretamente sobre o PMD VF , não recebe todos os pacotes que estão destinados ao VM, uma vez que alguns pacotes aparecem sobre a interface sintética.

Se executar uma aplicação DPDK sobre o PMD de segurança, garante que a aplicação recebe todos os pacotes que lhe estão destinados. Também garante que a aplicação continua a funcionar no modo DPDK, mesmo que o VF seja revogado quando o hospedeiro estiver a ser reparado. Para obter mais informações sobre o PMD seguro, consulte a biblioteca do controlador do modo de pesquisa de segurança de falhas.

Teste de execução

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

Básico: Verificação de sanidade, inicialização do adaptador de segurança

  1. Executar os seguintes comandos para iniciar uma única aplicação de teste de porta:

    testpmd -w <pci address from previous step> \
      --vdev="net_vdev_netvsc0,iface=eth1" \
      -- -i \
      --port-topology=chained
    
  2. Executar os seguintes comandos para iniciar uma aplicação de teste de porta dupla:

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    --vdev="net_vdev_netvsc0,iface=eth1" \
    --vdev="net_vdev_netvsc1,iface=eth2" \
    -- -i
    

    Se estiver a fazer testes com mais de dois NICs, o --vdev argumento segue este padrão: net_vdev_netvsc<id>,iface=<vf’s pairing eth>.

  3. Depois de começar, corra show port info all para verificar a informação do porto. Deve ver uma ou duas portas DPDK que são net_failsafe (não net_mlx4).

  4. Use start <port> /stop <port> para começar o tráfego.

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

Básico: Único remetente/único recetor

Os seguintes comandos imprimem periodicamente os pacotes por segundo:

  1. Do lado TX, executar o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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. Do lado RX, executar o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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 estiver a executar os comandos anteriores numa máquina virtual, altere IP_SRC_ADDR e IP_DST_ADDRapp/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 largados antes de chegarem ao recetor.

Avançado: Remetente único/único avançado

Os seguintes comandos imprimem periodicamente os pacotes por segundo:

  1. Do lado TX, executar o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      -- --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. Do lado FWD, executar o seguinte comando:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      --vdev="net_vdev_netvsc<id>,iface=<the iface to attach to>" \
      --vdev="net_vdev_netvsc<2nd id>,iface=<2nd iface to attach to>" (you need as many --vdev arguments as the number of devices used by testpmd, in this case) \
      -- --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 estiver a executar os comandos anteriores numa máquina virtual, altere IP_SRC_ADDR e IP_DST_ADDRapp/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 largados antes de chegarem ao reencaminhador. Não poderá ter uma terceira máquina a receber tráfego reencaminhado, porque o reencaminhador de testes não modifica os endereços da camada 3, a menos que faça algumas alterações de código.

Referências