Ative o processamento de pacotes de rede mais rápido com o DPDK

Este documento explica como ativar o Data Plane Development Kit (DPDK) numa instância de máquina virtual (VM) para um processamento de pacotes de rede mais rápido.

O DPDK é uma framework para aplicações com utilização intensiva de desempenho que requerem um processamento rápido de pacotes, baixa latência e um desempenho consistente. O DPDK fornece um conjunto de bibliotecas do plano de dados e um controlador de interface de rede (NIC) que ignoram a rede do kernel e são executados diretamente no espaço do utilizador. Por exemplo, a ativação do DPDK na sua VM é útil quando executa o seguinte:

  • Implementações de virtualização de funções de rede (NFV)

  • Aplicações de rede definida por software (SDN)

  • Streaming de vídeo ou aplicações de voz sobre IP

Pode executar o DPDK numa VM que use um dos seguintes tipos de NIC virtual (vNIC):

  • Recomendado: gVNIC

    Uma interface de rede virtual de elevado desempenho, segura e escalável concebida especificamente para o Compute Engine que sucede ao virtIO como a vNIC de próxima geração.

  • VirtIO-Net

    Um controlador Ethernet de código aberto que permite às VMs acederem de forma eficiente a hardware físico, como armazenamento de blocos e adaptadores de rede.

Um problema com a execução do DPDK num ambiente virtual, em vez de num hardware físico, é que os ambientes virtuais não suportam SR-IOV e a unidade de gestão de memória de E/S (IOMMU) para aplicações de alto desempenho. Para ultrapassar esta limitação, tem de executar o DPDK em endereços físicos de convidados em vez de endereços virtuais do anfitrião através de um dos seguintes controladores:

Antes de começar

  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Trusted Cloud by S3NS serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Trusted Cloud console to access Trusted Cloud by S3NS services and APIs, you don't need to set up authentication.

    gcloud

    1. Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init
    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

    Para mais informações, consulte o artigo Autenticar para usar REST na Trusted Cloud documentação de autenticação.

Requisitos

Ao criar uma VM para executar o DPDK, certifique-se do seguinte:

  • Para evitar a falta de conetividade de rede quando executar as suas aplicações, use duas redes de nuvem privada virtual:

    • Uma rede da VPC para o plano de controlo

    • Uma rede de VPC para o plano de dados

  • As duas redes de VPC têm de especificar o seguinte:

    • Uma sub-rede com um intervalo de endereços IP exclusivo

    • A mesma região para as respetivas sub-redes

    • O mesmo tipo de VNIC, ou seja, gVNIC ou VirtIO-Net

  • Ao criar a VM:

    • Tem de especificar a mesma região que as sub-redes das duas redes de VPC.

    • Tem de especificar o tipo de vNIC que planeia usar com o DPDK.

    • Tem de especificar uma série de máquinas suportada para gVNIC ou VirtIO-Net.

Restrições

A execução do DPDK numa VM tem as seguintes restrições:

Vista geral das funcionalidades e versões do DPDK

A Google recomenda a utilização da versão mais recente do controlador DPDK para beneficiar das funcionalidades mais recentes e das correções de erros. A lista seguinte oferece uma vista geral do que está disponível com cada versão do controlador DPDK:

24,07
24.03
Suporte de RSS (para todos os tipos de máquinas suportados).
23.11
  • Suporte do tamanho da memória intermédia de RX (para todos os tipos de máquinas suportados).
  • Suporte de frames jumbo (9K) para tipos de máquinas de terceira geração e posteriores.
23.07
  • Foi adicionado suporte para tipos de máquinas de terceira geração e posteriores.
  • Suporte de frames jumbo (9K) para tipos de máquinas de primeira e segunda geração.
23.03

Suporte para estatísticas de relatórios:

  • Estatísticas de software para todos os tipos de máquinas suportados.
  • Estatísticas de hardware para tipos de máquinas de primeira e segunda geração.
22.11
Lançamento inicial do controlador com suporte para tipos de máquinas de primeira e segunda geração.

Configure uma VM para executar o DPDK

Esta secção explica como criar uma VM para executar o DPDK.

Crie as redes VPC

Crie duas redes VPC para o plano de dados e o plano de controlo, usando a Trusted Cloud consola, a CLI do Google Cloud ou a API Compute Engine. Pode especificar estas redes mais tarde quando criar a VM.

Consola

  1. Crie uma rede de VPC para o plano de dados:

    1. Na Trusted Cloud consola, aceda a Redes de VPC.

      Aceda a redes de VPC

      É apresentada a página Redes VPC.

    2. Clique em Criar rede de VPC.

      É apresentada a página Criar uma rede de VPC.

    3. No campo Nome, introduza um nome para a sua rede.

    4. Na secção Nova sub-rede, faça o seguinte:

      1. No campo Nome, introduza um nome para a sub-rede.

      2. No menu Região, selecione uma região para a sua sub-rede.

      3. Selecione IPv4 (single-stack) (predefinição).

      4. No intervalo IPv4, introduza um endereço de intervalo IPv4 válido na notação CIDR.

      5. Clique em Concluído.

    5. Clique em Criar.

      É apresentada a página Redes VPC. A criação da rede VPC pode demorar até um minuto.

  2. Crie uma rede VPC para o plano de controlo com uma regra de firewall para permitir ligações SSH à VM:

    1. Clique novamente em Criar rede de VPC.

      É apresentada a página Criar uma rede de VPC.

    2. No campo Nome, introduza um nome para a sua rede.

    3. Na secção Nova sub-rede, faça o seguinte:

      1. No campo Nome, introduza um nome para a sub-rede.

      2. No menu Região, selecione a mesma região que especificou para a sub-rede da rede do plano de dados.

      3. Selecione IPv4 (single-stack) (predefinição).

      4. No intervalo IPv4, introduza um endereço de intervalo IPv4 válido na notação CIDR.

      5. Clique em Concluído.

    4. No separador Regras de firewall IPv4, selecione a caixa de verificação NETWORK_NAME-allow-ssh.

      Onde NETWORK_NAME é o nome da rede que especificou nos passos anteriores.

    5. Clique em Criar.

      É apresentada a página Redes VPC. A criação da rede VPC pode demorar até um minuto.

gcloud

  1. Para criar uma rede VPC para o plano de dados, siga estes passos:

    1. Crie uma rede VPC com uma sub-rede criada manualmente usando o comando gcloud compute networks create com a flag --subnet-mode definida como custom.

      gcloud compute networks create DATA_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      Substitua o seguinte:

      • DATA_PLANE_NETWORK_NAME: o nome da rede VPC para o plano de dados.

      • MTU: a unidade de transmissão máxima (MTU), que é o tamanho máximo do pacote da rede. O valor tem de estar entre 1300 e 8896. O valor predefinido é 1460. Antes de definir a MTU para um valor superior a 1460, consulte o artigo Unidade de transmissão máxima.

    2. Crie uma sub-rede para a rede do plano de dados da VPC que acabou de criar com o comando gcloud compute networks subnets create.

      gcloud compute networks subnets create DATA_PLANE_SUBNET_NAME \
          --network=DATA_PLANE_NETWORK_NAME \
          --range=DATA_PRIMARY_RANGE \
          --region=REGION
      

      Substitua o seguinte:

      • DATA_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de dados.

      • DATA_PLANE_NETWORK_NAME: o nome da rede do plano de dados que especificou nos passos anteriores.

      • DATA_PRIMARY_RANGE: um intervalo IPv4 válido para a sub-rede na notação CIDR.

      • REGION: a região onde criar a sub-rede.

  2. Para criar uma rede VPC para o plano de controlo com uma regra de firewall para permitir ligações SSH à VM, siga estes passos:

    1. Crie uma rede VPC com uma sub-rede criada manualmente usando o comando gcloud compute networks create com a flag --subnet-mode definida como custom.

      gcloud compute networks create CONTROL_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      Substitua o seguinte:

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede VPC para o plano de controlo.

      • MTU: o MTU, que é o tamanho do pacote mais grande da rede. O valor tem de estar entre 1300 e 8896. O valor predefinido é 1460. Antes de definir a MTU para um valor superior a 1460, consulte o artigo Unidade de transmissão máxima.

    2. Crie uma sub-rede para a rede do plano de controlo da VPC que acabou de criar com o comando gcloud compute networks subnets create.

      gcloud compute networks subnets create CONTROL_PLANE_SUBNET_NAME \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --range=CONTROL_PRIMARY_RANGE \
          --region=REGION
      

      Substitua o seguinte:

      • CONTROL_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo.

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que especificou nos passos anteriores.

      • CONTROL_PRIMARY_RANGE: um intervalo IPv4 válido para a sub-rede na notação CIDR.

      • REGION: a região onde criar a sub-rede, que tem de corresponder à região especificada na sub-rede da rede do plano de dados.

    3. Crie uma regra de firewall da VPC que permita ligações SSH à rede do plano de controlo através do comando gcloud compute firewall-rules create com a flag --allow definida como tcp:22.

      gcloud compute firewall-rules create FIREWALL_RULE_NAME \
          --action=allow \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --rules=tcp:22
      

      Substitua o seguinte:

      • FIREWALL_RULE_NAME: o nome da regra da firewall.

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que criou nos passos anteriores.

API

  1. Para criar uma rede VPC para o plano de dados, siga estes passos:

    1. Crie uma rede VPC com uma sub-rede criada manualmente enviando um pedido POST para o método networks.insert com o campo autoCreateSubnetworks definido como false.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "DATA_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto atual.

      • DATA_PLANE_NETWORK_NAME: o nome da rede para o plano de dados.

      • MTU: a unidade de transmissão máxima (MTU), que é o tamanho máximo do pacote da rede. O valor tem de estar entre 1300 e 8896. O valor predefinido é 1460. Antes de definir a MTU para um valor superior a 1460, consulte o artigo Unidade de transmissão máxima.

    2. Crie uma sub-rede para a rede do plano de dados da VPC fazendo um pedido POST ao método subnetworks.insert.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "DATA_PRIMARY_RANGE",
        "name": "DATA_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/DATA_PLANE_NETWORK_NAME"
      }
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto onde a rede do plano de dados está localizada.

      • REGION: a região onde quer criar a sub-rede.

      • DATA_PRIMARY_RANGE: o intervalo IPv4 principal para a nova sub-rede na notação CIDR.

      • DATA_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de dados que criou no passo anterior.

      • DATA_PLANE_NETWORK_NAME: o nome da rede do plano de dados que criou no passo anterior.

  2. Para criar uma rede VPC para o plano de controlo com uma regra de firewall para permitir ligações SSH à VM, siga estes passos:

    1. Crie uma rede VPC com uma sub-rede criada manualmente enviando um pedido POST para o método networks.insert com o campo autoCreateSubnetworks definido como false.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "CONTROL_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto atual.

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede para o plano de controlo.

      • MTU: o MTU, que é o tamanho do pacote mais grande da rede. O valor tem de estar entre 1300 e 8896. O valor predefinido é 1460. Antes de definir a MTU para um valor superior a 1460, consulte o artigo Unidade de transmissão máxima.

    2. Crie uma sub-rede para a rede de controlo de dados da VPC fazendo um pedido POST ao método subnetworks.insert.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "CONTROL_PRIMARY_RANGE",
        "name": "CONTROL_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto onde se encontra a rede do plano de controlo.

      • REGION: a região onde quer criar a sub-rede.

      • CONTROL_PRIMARY_RANGE: o intervalo IPv4 principal para a nova sub-rede na notação CIDR.

      • CONTROL_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo que criou no passo anterior.

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que criou no passo anterior.

    3. Crie uma regra de firewall da VPC que permita ligações SSH à rede do plano de controlo fazendo um pedido POST ao método firewalls.insert. Na solicitação, defina o campo IPProtocol como tcp e o campo ports como 22.

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
      
      {
        "allowed": [
          {
            "IPProtocol": "tcp",
            "ports": [ "22" ]
          }
        ],
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto onde se encontra a rede do plano de controlo.

      • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que criou nos passos anteriores.

Para mais opções de configuração ao criar uma rede VPC, consulte o artigo Crie e faça a gestão de redes VPC.

Crie uma VM que use as redes VPC para DPDK

Crie uma VM que ative a gVNIC ou a virtIO-Net nas duas redes VPC que criou anteriormente através da Trusted Cloud consola, da CLI gcloud e da API Compute Engine.

Recomendado: especifique o Ubuntu LTS ou o Ubuntu Pro como a imagem do sistema operativo devido ao respetivo suporte do gestor de pacotes para os controladores UIO e VFIO sem IOMMU. Se não quiser especificar nenhum destes sistemas operativos, recomendamos que especifique Debian 11 ou posterior para um processamento de pacotes mais rápido.

Consola

Crie uma VM que use as duas sub-redes da rede de VPC que criou nos passos anteriores fazendo o seguinte:

  1. Na Trusted Cloud consola, aceda a Instâncias de VM.

    Aceder às instâncias de VM

    É aberta a página Instâncias de VM.

  2. Clique em Criar instância.

    É apresentada a página Criar uma instância.

  3. No campo Nome, introduza um nome para a MV.

  4. No menu Região, selecione a mesma região onde criou as suas redes nos passos anteriores.

  5. No menu Zona, selecione uma zona para a sua VM.

  6. Na secção Configuração da máquina, faça o seguinte:

    1. Selecione uma das seguintes opções:

      • Para cargas de trabalho comuns, selecione o separador Utilização geral (predefinição).

      • Para cargas de trabalho com utilização intensiva do desempenho, selecione o separador Otimizado para computação.

      • Para cargas de trabalho com rácios de memória para vCPUs elevados, selecione o separador Otimizado para memória.

      • Para cargas de trabalho que usam unidades de processamento de gráficos (GPUs), selecione o separador GPUs.

    2. Opcional. Se especificou GPUs no passo anterior e quiser alterar a GPU a associar à VM, faça uma ou mais das seguintes ações:

      1. No menu Tipo de GPU, selecione um tipo de GPU.

      2. No menu Número de GPUs, selecione o número de GPUs.

    3. No menu Série, selecione uma série de máquinas.

    4. No menu Tipo de máquina, selecione um tipo de máquina.

    5. Opcional: expanda Configurações avançadas e siga as instruções para personalizar ainda mais a máquina para esta VM.

  7. Opcional: na secção Disco de arranque, clique em Alterar e, de seguida, siga as instruções para alterar a imagem do disco.

  8. Expanda a secção Opções avançadas.

  9. Expanda a secção Rede.

  10. Na secção Configuração do desempenho da rede, faça o seguinte:

    1. No menu Placa de interface de rede, selecione uma das seguintes opções:

      • Para usar o gVNIC, selecione gVNIC.

      • Para usar o VirtIO-Net, selecione VirtIO.

    2. Opcional: para um desempenho de rede mais elevado e uma latência reduzida, selecione a caixa de verificação Ativar redes de nível 1.

  11. Na secção Interfaces de rede, faça o seguinte:

    1. Na linha predefinição, clique em Eliminar item "predefinição".

    2. Clique em Adicionar interface de rede.

      É apresentada a secção Nova interface de rede.

    3. No menu Rede, selecione a rede do plano de controlo que criou nos passos anteriores.

    4. Clique em Concluído.

    5. Clique novamente em Adicionar interface de rede.

      É apresentada a secção Nova interface de rede.

    6. No menu Rede, selecione a rede do plano de dados que criou nos passos anteriores.

    7. Clique em Concluído.

  12. Clique em Criar.

    É aberta a página Instâncias de VM. A criação da VM pode demorar até um minuto.

gcloud

Crie uma VM que use as duas sub-redes da rede VPC que criou nos passos anteriores usando o comando gcloud compute instances create com as seguintes flags:

gcloud compute instances create VM_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --machine-type=MACHINE_TYPE  \
    --network-interface=network=CONTROL_PLANE_NETWORK_NAME,subnet=CONTROL_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --network-interface=network=DATA_PLANE_NETWORK_NAME,subnet=DATA_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --zone=ZONE

Substitua o seguinte:

  • VM_NAME: o nome da VM.

  • IMAGE_FAMILY: a família de imagens do sistema operativo com que o disco de arranque vai ser inicializado. Em alternativa, pode especificar a flag --image=IMAGE e substituir IMAGE por uma versão específica de uma imagem. Saiba como ver uma lista de imagens disponíveis no projeto de imagens do Compute Engine.

  • IMAGE_PROJECT: o nome do projeto de imagem que contém a imagem do disco.

  • MACHINE_TYPE: um tipo de máquina, predefinido ou personalizado, para a VM.

  • VNIC_TYPE: o tipo de vNIC a usar para as redes do plano de controlo e do plano de dados. O valor tem de ser um dos seguintes:

    • Para usar o gVNIC, especifique GVNIC.

    • Para usar o VirtIO-Net, especifique VIRTIO_NET.

  • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que criou nos passos anteriores.

  • CONTROL_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo que criou nos passos anteriores.

  • DATA_PLANE_NETWORK_NAME: o nome da rede do plano de dados que criou nos passos anteriores.

  • DATA_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo que criou automaticamente nos passos anteriores.

  • ZONE: a zona onde criar a VM. Especifique uma zona na mesma região da sub-rede que criou nos passos anteriores.

Por exemplo, para criar uma VM denominada dpdk-vm na zona us-central1-a que especifica um disco persistente SSD de 512 GB, um tipo de máquina C2 predefinido com 60 vCPUs, redes de nível 1 e uma rede de plano de dados e uma rede de plano de controlo que usam gVNIC, execute o seguinte comando:

gcloud compute instances create dpdk-vm \
    --boot-disk-size=512GB \
    --boot-disk-type=pd-ssd \
    --image-project=ubuntu-os-cloud \
    --image-family=ubuntu-2004-lts \
    --machine-type=c2-standard-60 \
    --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
    --network-interface=network=control,subnet=control,nic-type=GVNIC \
    --network-interface=network=data,subnet=data,nic-type=GVNIC \
    --zone=us-central1-a

API

Crie uma VM que use as duas sub-redes da rede VPC que criou nos passos anteriores fazendo um pedido POST ao método instances.insert com os seguintes campos:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "MACHINE_TYPE",
  "disks": [
    {
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE_FAMILY"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/CONTROL_PLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/CONTROL_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    },
    {
      "network": "global/networks/DATAPLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/DATA_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    }
  ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde se encontram a rede VPC do plano de controlo e a rede VPC do plano de dados.

  • ZONE: a zona onde criar a VM.

  • VM_NAME: o nome da VM.

  • MACHINE_TYPE: um tipo de máquina, predefinido ou personalizado, para a VM.

  • IMAGE_PROJECT: o nome do projeto de imagem que contém a imagem do disco.

  • IMAGE_FAMILY: a família de imagens do sistema operativo com que o disco de arranque vai ser inicializado. Em alternativa, pode especificar uma versão específica de uma imagem. Saiba como ver uma lista de imagens no projeto de imagens do Compute Engine.

  • CONTROL_PLANE_NETWORK_NAME: o nome da rede do plano de controlo que criou nos passos anteriores.

  • REGION: a região onde existem as sub-redes das redes do plano de controlo e do plano de dados.

  • CONTROL_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo que criou nos passos anteriores.

  • VNIC_TYPE: o tipo de vNIC a usar para as redes do plano de controlo e do plano de dados. O valor tem de ser um dos seguintes:

    • Para usar o gVNIC, especifique GVNIC.

    • Para usar o VirtIO-Net, especifique VIRTIO_NET.

  • DATA_PLANE_NETWORK_NAME: o nome da rede do plano de dados que criou nos passos anteriores.

  • DATA_PLANE_SUBNET_NAME: o nome da sub-rede para a rede do plano de controlo que criou nos passos anteriores.

Por exemplo, para criar uma VM denominada dpdk-vm na zona us-central1-a que especifica um disco persistente SSD de 512 GB, um tipo de máquina C2 predefinido com 60 vCPUs, rede de nível 1 e uma rede de plano de dados e de plano de controlo que usam gVNIC, faça o seguinte pedido POST:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances

{
  "name": "dpdk-vm",
  "machineType": "c2-standard-60",
  "disks": [
    {
      "initializeParams": {
        "diskSizeGb": "512GB",
        "diskType": "pd-ssd",
        "sourceImage": "projects/ubuntu-os-cloud/global/images/ubuntu-2004-lts"
      },
      "boot": true
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/control",
      "subnetwork": "regions/us-central1/subnetworks/control",
      "nicType": "GVNIC"
    },
    {
      "network": "global/networks/data",
      "subnetwork": "regions/us-central1/subnetworks/data",
      "nicType": "GVNIC"
    }
  ],
  "networkPerformanceConfig": {
    "totalEgressBandwidthTier": "TIER_1"
  }
}

Para mais opções de configuração ao criar uma VM, consulte o artigo Crie e inicie uma instância de VM.

Instale o DPDK na sua VM

Para instalar o DPDK na sua VM, siga estes passos:

  1. Estabeleça ligação à VM que criou na secção anterior através do SSH.

  2. Configure as dependências para a instalação do DPDK:

    sudo apt-get update && sudo apt-get upgrade -yq
    sudo apt-get install -yq build-essential ninja-build python3-pip \
        linux-headers-$(uname -r) pkg-config libnuma-dev
    sudo pip install pyelftools meson
    
  3. Instale o DPDK:

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. Para criar o DPDK com os exemplos:

    meson setup -Dexamples=all build
    sudo ninja -C build install; sudo ldconfig
    

Instale o controlador

Para preparar o DPDK para ser executado num controlador, instale o controlador selecionando um dos seguintes métodos:

Instale um VFIO sem IOMMU

Para instalar o controlador VFIO sem IOMMU, siga estes passos:

  1. Verifique se o VFIO está ativado:

    cat /boot/config-$(uname -r) | grep NOIOMMU
    

    Se o VFIO não estiver ativado, siga os passos em Instale o UIO.

  2. Ative o No-IOMMU mode no VFIO:

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
    

Instale o UIO

Para instalar o controlador UIO no DPDK, selecione um dos seguintes métodos:

Instale o UIO através do git

Para instalar o controlador UIO no DPDK através do git, siga estes passos:

  1. Clone o igb_uio repositório Git para um disco na sua VM:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. A partir do diretório principal do repositório git clonado, crie o módulo e instale o controlador UIO no DPDK:

    pushd dpdk-kmods/linux/igb_uio
    sudo make
    sudo depmod && sudo insmod igb_uio.ko
    popd
    

Instale o UIO através de pacotes Linux

Para instalar o controlador UIO no DPDK através de pacotes Linux, siga estes passos:

  1. Instale o pacote dpdk-igb-uio-dkms:

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. Instale o controlador UIO no DPDK:

    sudo modprobe igb_uio
    

Associe o DPDK a um controlador e teste-o

Para associar o DPDK ao controlador que instalou na secção anterior, siga estes passos:

  1. Obtenha o número do espaço Peripheral Component Interconnect (PCI) para a interface de rede atual:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    Por exemplo, se a VM estiver a usar ens4 como interface de rede, o número do slot PCI é 00:04.0.

  2. Pare a interface de rede ligada ao adaptador de rede:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    Substitua NETWORK_INTERFACE_NAME pelo nome da interface de rede especificada nas redes VPC. Para ver que interface de rede a VM está a usar, veja a configuração da interface de rede:

    sudo ifconfig
    
  3. Vincule o DPDK ao controlador:

    sudo dpdk-devbind.py --bind=DRIVER PCI_SLOT_NUMBER
    

    Substitua o seguinte:

    • DRIVER: o controlador no qual o DPDK deve ser associado. Especifique um dos seguintes valores:

      • UIO driver: igb_uio

      • Controlador VFIO sem IOMMU: vfio-pci

    • PCI_SLOT_NUMBER: o número do slot PCI da interface de rede atual formatado como 00:0NUMBER.0.

  4. Crie o diretório /mnt/huge e, em seguida, crie algumas páginas grandes para o DPDK usar para buffers:

    sudo mkdir /mnt/huge
    sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
    sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
    sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
    
  5. Teste se o DPDK consegue usar a interface de rede que criou nos passos anteriores executando a aplicação de exemplo testpmd incluída nas bibliotecas do DPDK:

    sudo ./build/app/dpdk-testpmd
    

    Para mais informações sobre os testes do DPDK, consulte as opções da linha de comandos do Testpmd.

Desvincule o DPDK

Depois de usar o DPDK, pode desassociá-lo do controlador que instalou na secção anterior. Para desassociar o DPDK, siga estes passos:

  1. Desvincule o DPDK do controlador:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    Substitua PCI_SLOT_NUMBER pelo número da ranhura PCI que especificou nos passos anteriores. Se quiser validar o número da ranhura PCI para a interface de rede atual:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    Por exemplo, se a VM estiver a usar ens4 como interface de rede, o número do slot PCI é 00:04.0.

  2. Atualize o controlador de rede do Compute Engine:

    sudo bash -c 'echo PCI_SLOT_NUMBER > /sys/bus/pci/drivers/VNIC_DIRECTORY/bind'
    sudo ip link set NETWORK_INTERFACE_NAME up
    

    Substitua o seguinte:

    • PCI_SLOT_NUMBER: o número do slot PCI especificado nos passos anteriores.

    • VNIC_DIRECTORY: o diretório da vNIC. Consoante o tipo de vNIC que estiver a usar, especifique um dos seguintes valores:

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

    • NETWORK_INTERFACE_NAME: o nome da interface de rede que especificou na secção anterior.

O que se segue?