Habilite um processamento mais rápido de pacotes de rede com DPDK


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

DPDK é uma estrutura para aplicativos de alto desempenho que exigem processamento rápido de pacotes, baixa latência e desempenho consistente. O DPDK fornece um conjunto de bibliotecas de plano de dados e um controlador de interface de rede (NIC) que ignora a rede do kernel e é executado diretamente no espaço do usuário. Por exemplo, ativar o DPDK na sua VM é útil ao executar o seguinte:

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

  • Aplicativos de rede definida por software (SDN)

  • Aplicativos de streaming de vídeo ou voz sobre IP

Você pode executar o DPDK em uma VM usando um dos seguintes tipos de NIC virtual (vNIC):

  • Recomendado: gVNIC

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

  • VirtIO-Net

    Um driver Ethernet de código aberto que permite que as VMs acessem com eficiência hardwares físicos, como armazenamento em bloco e adaptadores de rede.

Um problema com a execução do DPDK em um ambiente virtual, em vez de em hardware físico, é que os ambientes virtuais não têm suporte para SR-IOV e I/O Memory Management Unit (IOMMU) para aplicativos de alto desempenho. Para superar essa limitação, você deve executar o DPDK em endereços físicos convidados em vez de hospedar endereços virtuais usando um dos seguintes drivers:

Antes de começar

  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar 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 Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. REST

      Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

Requisitos

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

  • Para evitar a falta de conectividade de rede ao executar suas aplicações, use duas redes Virtual Private Cloud:

    • Uma rede VPC para o plano de controle

    • Uma rede VPC para o plano de dados

  • As duas redes VPC devem especificar o seguinte:

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

    • A mesma região para suas sub-redes

    • O mesmo tipo de VNIC — gVNIC ou VirtIO-Net

  • Ao criar a VM:

    • Você deve especificar a mesma região das sub-redes das duas redes VPC.

    • Você deve especificar o tipo de vNIC que planeja usar com o DPDK.

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

Restrições

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

Configure uma VM para executar o DPDK

Esta seçã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 controle, usando o console do Google Cloud, a CLI do Google Cloud ou a API Compute Engine. Posteriormente, você poderá especificar essas redes ao criar a VM.

Console

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

    1. No console do Google Cloud, acesse Redes VPC .

      Acesse redes VPC

      A página de redes VPC é aberta.

    2. Clique em Criar rede VPC .

      A página Criar uma rede VPC é aberta.

    3. No campo Nome , insira um nome para sua rede.

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

      1. No campo Nome , insira um nome para sua sub-rede.

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

      3. Selecione IPv4 (pilha única) (padrão).

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

      5. Clique em Concluído .

    5. Clique em Criar .

      A página de redes VPC é aberta. Pode levar até um minuto para que a criação da rede VPC seja concluída.

  2. Crie uma rede VPC para o plano de controle com uma regra de firewall para permitir conexões SSH na VM:

    1. Clique em Criar rede VPC novamente.

      A página Criar uma rede VPC é aberta.

    2. No campo Nome , insira um nome para sua rede.

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

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

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

      3. Selecione IPv4 (pilha única) (padrão).

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

      5. Clique em Concluído .

    4. Na guia regras de firewall IPv4 , marque a caixa de seleção NETWORK_NAME -allow-ssh .

      Onde NETWORK_NAME é o nome da rede que você especificou nas etapas anteriores.

    5. Clique em Criar .

      A página de redes VPC é aberta. Pode levar até um minuto para que a criação da rede VPC seja concluída.

gcloud

  1. Para criar uma rede VPC para o plano de dados, siga estas etapas:

    1. Crie uma rede VPC com uma sub-rede criada manualmente usando o comando gcloud compute networks create com a sinalização --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 do plano de dados.

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

    2. Crie uma sub-rede para a rede de plano de dados VPC que você acabou de criar usando 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 da rede do plano de dados.

      • DATA_PLANE_NETWORK_NAME : o nome da rede do plano de dados que você especificou nas etapas anteriores.

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

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

  2. Para criar uma rede VPC para o plano de controle com uma regra de firewall para permitir conexões SSH na VM, siga estas etapas:

    1. Crie uma rede VPC com uma sub-rede criada manualmente usando o comando gcloud compute networks create com a sinalização --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 do plano de controle.

      • MTU : o MTU, que é o maior tamanho de pacote da rede. O valor deve estar entre 1300 e 8896 . O valor padrão é 1460 . Antes de definir o MTU para um valor superior a 1460 , consulte Unidade máxima de transmissão .

    2. Crie uma sub-rede para a rede do plano de controle da VPC que você acabou de criar usando 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 da rede do plano de controle.

      • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você especificou nas etapas anteriores.

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

      • REGION : a região onde criar a sub-rede, que deve corresponder à região que você especificou na sub-rede da rede do plano de dados.

    3. Crie uma regra de firewall VPC que permita SSH na rede do plano de controle usando o gcloud compute firewall-rules create com o sinalizador --allow definido 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 de firewall.

      • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você criou nas etapas anteriores.

API

  1. Para criar uma rede VPC para o plano de dados, siga estas etapas:

    1. Crie uma rede VPC com uma sub-rede criada manualmente fazendo uma solicitação 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 do plano de dados.

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

    2. Crie uma sub-rede para a rede do plano de dados VPC fazendo uma solicitação POST para o 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 você deseja criar a sub-rede.

      • DATA_PRIMARY_RANGE : o intervalo IPv4 primário para a nova sub-rede em notação CIDR.

      • DATA_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de dados que você criou na etapa anterior.

      • DATA_PLANE_NETWORK_NAME : o nome da rede do plano de dados que você criou na etapa anterior.

  2. Para criar uma rede VPC para o plano de controle com uma regra de firewall para permitir SSH na VM, siga estas etapas:

    1. Crie uma rede VPC com uma sub-rede criada manualmente fazendo uma solicitação 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 do plano de controle.

      • MTU : o MTU, que é o maior tamanho de pacote da rede. O valor deve estar entre 1300 e 8896 . O valor padrão é 1460 . Antes de definir o MTU para um valor superior a 1460 , consulte Unidade máxima de transmissão .

    2. Crie uma sub-rede para a rede de controle de dados VPC fazendo uma solicitação POST para o 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 a rede do plano de controle está localizada.

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

      • CONTROL_PRIMARY_RANGE : o intervalo IPv4 primário para a nova sub-rede em notação CIDR.

      • CONTROL_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de controle que você criou na etapa anterior.

      • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você criou na etapa anterior.

    3. Crie uma regra de firewall VPC que permita SSH na rede do plano de controle fazendo uma solicitação POST para o 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 a rede do plano de controle está localizada.

      • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você criou nas etapas anteriores.

Para obter mais opções de configuração ao criar uma rede VPC, consulte Criar e gerenciar redes VPC .

Crie uma VM que use as redes VPC para DPDK

Crie uma VM que habilite gVNIC ou virtIO-Net nas duas redes VPC que você criou anteriormente usando o console do Google Cloud, a CLI gcloud e a API Compute Engine.

Recomendado: Especifique Ubuntu LTS ou Ubuntu Pro como imagem do sistema operacional devido ao suporte do gerenciador de pacotes para os drivers UIO e VFIO sem IOMMU. Se você não quiser especificar nenhum desses sistemas operacionais, é recomendado especificar o Debian 11 ou posterior para um processamento de pacotes mais rápido.

Console

Crie uma VM que use as duas sub-redes de rede VPC criadas nas etapas anteriores fazendo o seguinte:

  1. No console do Google Cloud, acesse Instâncias de VM .

    Acesse as instâncias de VM

    A página de instâncias de VM é aberta.

  2. Clique em Criar instância .

    A página Criar uma instância é aberta.

  3. No campo Nome , insira um nome para sua VM.

  4. No menu Região , selecione a mesma região onde você criou suas redes nas etapas anteriores.

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

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

    1. Selecione uma das seguintes opções:

      • Para cargas de trabalho comuns, selecione a guia Finalidade geral (padrão).

      • Para cargas de trabalho com alto desempenho, selecione a guia Computação otimizada .

      • Para cargas de trabalho com altas taxas de memória para vCPUs, selecione a guia Memória otimizada .

      • Para cargas de trabalho que usam unidades de processamento gráfico (GPUs), selecione a guia GPUs .

    2. Opcional. Se você especificou GPUs na etapa anterior e deseja alterar a GPU para anexar à VM, siga um ou mais dos seguintes procedimentos:

      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áquina.

    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 seção Disco de inicialização , clique em Alterar e siga as instruções para alterar a imagem do disco.

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

  9. Expanda a seção Rede .

  10. Na seção Configuração de desempenho da rede , faça o seguinte:

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

      • Para usar gVNIC, selecione gVNIC .

      • Para usar VirtIO-Net, selecione VirtIO .

    2. Opcional: para maior desempenho de rede e latência reduzida, marque a caixa de seleção Habilitar rede Tier_1 .

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

    1. Na linha padrão , clique em Excluir item "default" .

    2. Clique em Adicionar interface de rede .

      A seção Nova interface de rede é exibida.

    3. No menu Rede , selecione a rede do plano de controle que você criou nas etapas anteriores.

    4. Clique em Concluído .

    5. Clique em Adicionar interface de rede novamente.

      A seção Nova interface de rede é exibida.

    6. No menu Rede , selecione a rede do plano de dados que você criou nas etapas anteriores.

    7. Clique em Concluído .

  12. Clique em Criar .

    A página de instâncias de VM é aberta. Pode levar até um minuto para que a criação da VM seja concluída.

gcloud

Crie uma VM que use as duas sub-redes de rede VPC que você criou nas etapas anteriores usando o gcloud compute instances create com as seguintes sinalizações:

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 operacional com o qual o disco de inicialização será inicializado. Alternativamente, você pode especificar o sinalizador --image= IMAGE e substituir IMAGE por uma versão específica de uma imagem. Saiba como visualizar 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 ser usado para as redes do plano de controle e do plano de dados. O valor deve ser um dos seguintes:

    • Para usar gVNIC, especifique GVNIC .

    • Para usar VirtIO-Net, especifique VIRTIO_NET .

  • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você criou nas etapas anteriores.

  • CONTROL_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de controle que você criou nas etapas anteriores.

  • DATA_PLANE_NETWORK_NAME : o nome da rede do plano de dados que você criou nas etapas anteriores.

  • DATA_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de controle que você criou automaticamente nas etapas anteriores.

  • ZONE : a zona onde criar a VM. Especifique uma zona dentro da mesma região da sub-rede que você criou nas etapas anteriores.

Por exemplo, para criar uma VM chamada dpdk-vm na zona us-central1-a que especifica um disco permanente SSD de 512 GB, um tipo de máquina C2 predefinido com 60 vCPUs, rede Tier_1 e um plano de dados e uma rede de plano de controle 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 de rede VPC criadas nas etapas anteriores fazendo uma solicitação 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 a rede VPC do plano de controle e a rede VPC do plano de dados estão localizadas.

  • 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 operacional com o qual o disco de inicialização será inicializado. Alternativamente, você pode especificar uma versão específica de uma imagem. Saiba como visualizar uma lista de imagens no projeto de imagens do Compute Engine.

  • CONTROL_PLANE_NETWORK_NAME : o nome da rede do plano de controle que você criou nas etapas anteriores.

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

  • CONTROL_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de controle que você criou nas etapas anteriores.

  • VNIC_TYPE : o tipo de vNIC a ser usado para as redes do plano de controle e do plano de dados. O valor deve ser um dos seguintes:

    • Para usar gVNIC, especifique GVNIC .

    • Para usar VirtIO-Net, especifique VIRTIO_NET .

  • DATA_PLANE_NETWORK_NAME : o nome da rede do plano de dados que você criou nas etapas anteriores.

  • DATA_PLANE_SUBNET_NAME : o nome da sub-rede da rede do plano de controle que você criou nas etapas anteriores.

Por exemplo, para criar uma VM chamada dpdk-vm na zona us-central1-a que especifica um disco permanente SSD de 512 GB, um tipo de máquina C2 predefinido com 60 vCPUs, rede Tier_1 e um plano de dados e uma rede de plano de controle que usam gVNIC, faça a seguinte solicitação 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 obter mais opções de configuração ao criar uma VM, consulte Criar e iniciar uma instância de VM .

Instale o DPDK na sua VM

Para instalar o DPDK na sua VM, siga estas etapas:

  1. Conecte-se à VM que você criou na seção anterior usando SSH .

  2. Configure as dependências para 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 construir o DPDK com os exemplos:

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

Instalar driver

Para preparar o DPDK para execução em um driver, instale o driver selecionando um dos seguintes métodos:

Instale um VFIO sem IOMMU

Para instalar o driver VFIO sem IOMMU, siga estas etapas:

  1. Verifique se o VFIO está habilitado:

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

    Se o VFIO não estiver ativado, siga as etapas em Instalar UIO .

  2. Habilite o modo No-IOMMU no VFIO:

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

Instalar UIO

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

Instale o UIO usando git

Para instalar o driver UIO no DPDK usando git , siga estas etapas:

  1. Clone o repositório git igb_uio em um disco na sua VM:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. No diretório pai do repositório git clonado, construa o módulo e instale o driver UIO no DPDK:

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

Instale o UIO usando pacotes Linux

Para instalar o driver UIO no DPDK usando pacotes Linux, siga estas etapas:

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

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

    sudo modprobe igb_uio
    

Vincule o DPDK a um driver e teste-o

Para vincular o DPDK ao driver instalado na seção anterior, siga estas etapas:

  1. Obtenha o número do slot PCI (Peripheral Component Interconnect) da interface de rede atual:

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

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

  2. Pare a interface de rede conectada 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 qual interface de rede a VM está usando, visualize a configuração da interface de rede:

    sudo ifconfig
    
  3. Vincule o DPDK ao driver:

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

    Substitua o seguinte:

    • DRIVER : o driver para vincular o DPDK. Especifique um dos seguintes valores:

      • Driver UIO: igb_uio

      • Driver VFIO sem IOMMU: vfio-pci

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

  4. Crie o diretório /mnt/huge e, em seguida, crie algumas páginas enormes para o DPDK usar como 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 pode usar a interface de rede criada nas etapas anteriores executando o aplicativo de exemplo testpmd incluído nas bibliotecas DPDK:

    sudo ./build/app/dpdk-testpmd
    

    Para obter mais informações sobre como testar o DPDK, consulte Opções de linha de comando do Testpmd .

Desvincular DPDK

Depois de usar o DPDK, você pode desvinculá-lo do driver instalado na seção anterior. Para desvincular o DPDK, siga estas etapas:

  1. Desvincule o DPDK do driver:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    Substitua PCI_SLOT_NUMBER pelo número do slot PCI especificado nas etapas anteriores. Se quiser verificar o número do slot PCI da interface de rede atual:

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

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

  2. Recarregue o driver 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 que você especificou nas etapas anteriores.

    • VNIC_DIRECTORY : o diretório do vNIC. Dependendo do tipo de vNIC que você está usando, especifique um dos seguintes valores:

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

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

O que vem a seguir