Habilita el procesamiento de paquetes de red más rápido con DPDK


En este documento, se explica cómo habilitar el kit de desarrollo del plano de datos (DPDK) en una instancia de máquina virtual (VM) para lograr un procesamiento de paquetes de red más rápido.

DPDK es un framework para aplicaciones de uso intensivo que requieren un procesamiento rápido de paquetes, baja latencia y rendimiento coherente. El DPDK proporciona un conjunto de bibliotecas de planos de datos y un controlador de interfaz de red (NIC) que omiten la red de kernel y se ejecutan directamente en el espacio de usuario. Por ejemplo, habilitar el DPDK en tu VM es útil cuando ejecutas lo siguiente:

  • Implementaciones de virtualización de funciones de red (NFV)

  • Aplicaciones de red definida por software (SDN)

  • Aplicaciones de transmisión de video por Internet o por voz sobre IP

Puedes ejecutar DPDK en una VM mediante uno de los siguientes tipos de NIC virtuales (vNIC):

  • Recomendado: gVNIC

    Una interfaz de red virtual, segura y de alto rendimiento, diseñada específicamente para Compute Engine y que tiene éxito con virtIO como la vNIC de nueva generación.

  • VirtIO-Net

    Un controlador de Ethernet de código abierto que permite a las VMs acceder a hardware físico de manera eficiente, como el almacenamiento en bloque y los adaptadores de red.

Un problema con la ejecución de DPDK en un entorno virtual, en lugar del hardware físico, es que los entornos virtuales no son compatibles con SR-IOV y la unidad de administración de memoria de E/S (IOMMU) para aplicaciones de alto rendimiento. Para superar esta limitación, debes ejecutar el DPDK en las direcciones físicas de invitado en lugar de alojar direcciones virtuales mediante uno de los siguientes controladores:

Antes de comenzar

  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    Selecciona la pestaña para saber cómo planeas usar las muestras en esta página:

    Consola

    Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud, no necesitas configurar la autenticación.

    gcloud

    1. Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init
    2. Configura una región y una zona predeterminadas.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init

Requisitos

Cuando crees una VM para ejecutar el DPDK, asegúrate de lo siguiente:

  • Para evitar la falta de conectividad de red cuando ejecutas tus aplicaciones, usa dos redes de nube privada virtual:

    • Una red de VPC para el plano de control

    • Una red de VPC para el plano de datos

  • Las dos redes de VPC deben especificar lo siguiente:

    • Una subred con un rango de direcciones IP único

    • La misma región para sus subredes

    • El mismo tipo de VNIC, ya sea gVNIC o VirtIO-Net

  • Cuando crees la VM, haz lo siguiente:

    • Debes especificar la misma región que las dos subredes de las redes de VPC.

    • Debes especificar el tipo de vNIC que planeas usar con DPDK.

    • Debes especificar una serie de máquinas compatible para gVNIC o VirtIO-Net.

Restricciones

La ejecución de DPDK en una VM tiene las siguientes restricciones:

Configura una VM para ejecutar DPDK

En esta sección se explica cómo crear una VM para ejecutar DPDK.

Crea las redes de VPC

Crea dos redes de VPC para el plano de datos y el plano de control mediante la consola de Google Cloud, Google Cloud CLI o la API de Compute Engine. Luego, puedes especificar estas redes cuando creas la VM.

Consola

  1. Crea una red de VPC para el plano de datos:

    1. En la consola de Google Cloud, ve a Redes de VPC.

      Ir a las redes de VPC

      Se abrirá la página Redes de VPC.

    2. Haz clic en Crear red de VPC.

      Se abrirá la página Crear una red de VPC.

    3. En el campo Nombre, ingresa el nombre de tu red.

    4. En la sección Subred nueva, sigue estos pasos:

      1. En el campo Nombre, ingresa el nombre de tu subred.

      2. En el menú Región, selecciona una región para la subred.

      3. Selecciona IPv4 (pila única) (predeterminado).

      4. En el Rango de IPv4, ingresa una dirección de rango IPv4 válida en notación CIDR.

      5. Haz clic en Listo.

    5. Haz clic en Crear.

      Se abrirá la página Redes de VPC. La creación de la red de VPC puede tomar hasta un minuto en completarse.

  2. Crea una red de VPC para el plano de control con una regla de firewall que permita conexiones SSH a la VM:

    1. Vuelve a hacer clic en Crear red de VPC.

      Se abrirá la página Crear una red de VPC.

    2. En el campo Nombre, ingresa el nombre de tu red.

    3. En la sección Subred nueva, sigue estos pasos:

      1. En el campo Nombre, ingresa un nombre para la subred.

      2. En el menú Región, selecciona la misma región que especificaste para la subred de la red del plano de datos.

      3. Selecciona IPv4 (pila única) (predeterminado).

      4. En el Rango de IPv4, ingresa una dirección de rango IPv4 válida en notación CIDR.

      5. Haz clic en Listo.

    4. En la pestaña Reglas de firewall de IPv4, selecciona la casilla de verificación NETWORK_NAME-allow-ssh.

      En el ejemplo anterior, NETWORK_NAME es el nombre de la red que especificaste en los pasos anteriores.

    5. Haz clic en Crear.

      Se abrirá la página Redes de VPC. La creación de la red de VPC puede tomar hasta un minuto en completarse.

gcloud

  1. Para crear una red de VPC para el plano de datos, sigue estos pasos:

    1. Crea una red de VPC con una subred creada de forma manual mediante el comando gcloud compute networks create con la marca --subnet-mode establecida en custom.

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

      Reemplaza lo siguiente:

      • DATA_PLANE_NETWORK_NAME es el nombre de la red de VPC para el plano de datos.

      • MTU: es la unidad de transmisión máxima (MTU), que es el tamaño de paquete más grande de la red. El valor debe ser de entre 1300 y 8896. El valor predeterminado es 1460. Antes de configurar la MTU en un valor superior a 1460, consulta la Unidad de transmisión máxima.

    2. Crea una subred para la red del plano de datos de VPC que acabas de crear con el 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
      

      Reemplaza lo siguiente:

      • DATA_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de datos.

      • DATA_PLANE_NETWORK_NAME: El nombre de la red del plano de datos que especificaste en los pasos anteriores.

      • DATA_PRIMARY_RANGE: Un rango IPv4 válido para la subred en notación CIDR.

      • REGION: La región en la que se creará la subred.

  2. Para crear una red de VPC para el plano de control con una regla de firewall que permita conexiones SSH a la VM, sigue estos pasos:

    1. Crea una red de VPC con una subred creada de forma manual mediante el comando gcloud compute networks create con la marca --subnet-mode establecida en custom.

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

      Reemplaza lo siguiente:

      • CONTROL_PLANE_NETWORK_NAME: El nombre de la red de VPC para el plano de control.

      • MTU: Es la MTU, que es el tamaño de paquete más grande de la red. El valor debe ser de entre 1300 y 8896. El valor predeterminado es 1460. Antes de configurar la MTU en un valor superior a 1460, consulta la Unidad de transmisión máxima.

    2. Crea una subred para la red del plano de control de VPC que acabas de crear con el 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
      

      Reemplaza lo siguiente:

      • CONTROL_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de control.

      • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que especificaste en los pasos anteriores.

      • CONTROL_PRIMARY_RANGE: Un rango IPv4 válido para la subred en notación CIDR.

      • REGION: La región en la que se crea la subred, que debe coincidir con la región que especificaste en la subred de la red del plano de datos.

    3. Crea una regla de firewall de VPC que permita SSH en la red del plano de control mediante el comando gcloud compute firewall-rules create con la marca --allow establecida en tcp:22.

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

      Reemplaza lo siguiente:

      • FIREWALL_RULE_NAME: Es el nombre de la regla de firewall.

      • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que creaste en los pasos anteriores.

API

  1. Para crear una red de VPC para el plano de datos, sigue estos pasos:

    1. Crea una red de VPC con una subred creada de forma manual mediante una solicitud POST al método networks.insert con el campo autoCreateSubnetworks configurado como false

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

      Reemplaza lo siguiente:

      • PROJECT_ID: el ID del proyecto actual.

      • DATA_PLANE_NETWORK_NAME: el nombre de la red del plano de datos.

      • MTU: es la unidad de transmisión máxima (MTU), que es el tamaño de paquete más grande de la red. El valor debe ser de entre 1300 y 8896. El valor predeterminado es 1460. Antes de configurar la MTU en un valor superior a 1460, consulta la Unidad de transmisión máxima.

    2. Crea una subred para la red del plano de datos de VPC mediante una solicitud POST al 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"
      }
      

      Reemplaza lo siguiente:

      • PROJECT_ID: el ID del proyecto en el que se encuentra la red del plano de datos.

      • REGION: La región en la que deseas crear la subred.

      • DATA_PRIMARY_RANGE: El rango IPv4 principal para la subred nueva, en notación CIDR.

      • DATA_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de datos que creaste en el paso anterior

      • DATA_PLANE_NETWORK_NAME: El nombre de la red del plano de datos que creaste en el paso anterior.

  2. Para crear una red de VPC para el plano de control con una regla de firewall que permita la conexión SSH a la VM, sigue estos pasos:

    1. Crea una red de VPC con una subred creada de forma manual mediante una solicitud POST al método networks.insert con el campo autoCreateSubnetworks configurado como false

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

      Reemplaza lo siguiente:

      • PROJECT_ID: el ID del proyecto actual.

      • CONTROL_PLANE_NETWORK_NAME: el nombre de la red del plano de control.

      • MTU: Es la MTU, que es el tamaño de paquete más grande de la red. El valor debe ser de entre 1300 y 8896. El valor predeterminado es 1460. Antes de configurar la MTU en un valor superior a 1460, consulta la Unidad de transmisión máxima.

    2. Crea una subred para la red de control de datos de VPC mediante una solicitud POST al 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"
      }
      

      Reemplaza lo siguiente:

      • PROJECT_ID: e ID del proyecto en el que se encuentra la red del plano de control.

      • REGION: La región en la que deseas crear la subred.

      • CONTROL_PRIMARY_RANGE: El rango IPv4 principal para la subred nueva, en notación CIDR.

      • CONTROL_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de control que creaste en el paso anterior

      • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que creaste en el paso anterior.

    3. Crea una regla de firewall de VPC que permita SSH en la red del plano de control mediante una solicitud POST al método firewalls.insert. En la solicitud, configura el campo IPProtocol como tcp y el 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"
      }
      

      Reemplaza lo siguiente:

      • PROJECT_ID: e ID del proyecto en el que se encuentra la red del plano de control.

      • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que creaste en los pasos anteriores.

Para obtener más opciones de configuración cuando creas una red de VPC, consulta Crea y administra redes de VPC.

Crea una VM que use las redes de VPC para el DPDK

Crea una VM que habilite gVNIC o virtIO-Net en las dos redes de VPC que creaste antes mediante la consola de Google Cloud, la CLI de gcloud y la API de Compute Engine.

Recomendado: Especifica Ubuntu LTS o Ubuntu Pro como la imagen del sistema operativo debido a la compatibilidad de su administrador de paquetes con la IUO y la VFIO sin IOMMU controladores. Si no deseas especificar ninguno de estos sistemas operativos, se recomienda especificar Debian 11 o una versión posterior para lograr un procesamiento de paquetes más rápido.

Consola

Para crear una VM que use las dos subredes de la red de VPC que creaste en los pasos anteriores, haz lo siguiente:

  1. En la consola de Google Cloud, ve a Instancias de VM.

    Ir a Instancias de VM

    Se abrirá la página Instancias de VM.

  2. Haz clic en Crear instancia.

    Se abre la página Crear una instancia.

  3. En el campo Nombre, ingresa el nombre de tu VM.

  4. En el menú Región, selecciona la misma región en la que creaste tus redes en los pasos anteriores.

  5. En el menú Zona, selecciona una zona para tu VM.

  6. En la sección Configuración de la máquina, haz lo siguiente:

    1. Selecciona una de las opciones siguientes:

      • En las cargas de trabajo comunes, selecciona la pestaña Uso general (predeterminado).

      • Para cargas de trabajo de rendimiento intensivo, selecciona la pestaña Optimizado para procesamiento.

      • Para las cargas de trabajo de proporciones de memoria a CPU virtuales altas, selecciona la pestaña Memoria optimizada.

      • Para las cargas de trabajo que usan unidades de procesamiento de gráficos (GPU), selecciona la pestaña GPU.

    2. Opcional. Si especificaste GPU en el paso anterior y deseas cambiar la GPU para que se conecte a la VM, realiza una o más de las siguientes acciones:

      1. En el menú Tipo de GPU, selecciona un tipo de GPU.

      2. En el menú Cantidad de GPU, selecciona la cantidad.

    3. En el menú Serie, selecciona una serie de máquinas.

    4. En el menú Tipo de máquina, selecciona un tipo de máquina.

    5. Opcional: Expande Configuración avanzada y sigue las indicaciones para personalizar aún más la máquina de esta VM.

  7. Opcional: En la sección Disco de arranque, haz clic en Cambiar y, luego, sigue las instrucciones para cambiar la imagen de disco.

  8. Expanda la sección Opciones avanzadas.

  9. Expande la sección Herramientas de redes.

  10. En la sección Configuración del rendimiento de la red, haz lo siguiente:

    1. En el menú Tarjeta de interfaz de red, selecciona una de las siguientes opciones:

      • Para usar gVNIC, selecciona gVNIC.

      • Para usar VirtIO-Net, selecciona VirtIO.

    2. Opcional: Para obtener un mayor rendimiento de red y una latencia reducida, selecciona la casilla de verificación Habilitar Herramientas de redes de nivel 1.

  11. En la sección Interfaces de red, haz lo siguiente:

    1. En la fila predeterminada, haz clic en Borrar elemento “predeterminado”.

    2. Haz clic en Agregar interfaz de red.

      Aparecerá la sección Nueva interfaz de red.

    3. En el menú Red, selecciona la red del plano de control que creaste en los pasos anteriores.

    4. Haz clic en Listo.

    5. Vuelve a hacer clic en Agregar interfaz de red.

      Aparecerá la sección Nueva interfaz de red.

    6. En el menú Red, selecciona la red del plano de datos que creaste en los pasos anteriores.

    7. Haz clic en Listo.

  12. Haz clic en Crear.

    Se abrirá la página Instancias de VM. La creación de la VM puede tomar hasta un minuto en completarse.

gcloud

Crea una VM que use las dos subredes de red de VPC que creaste en los pasos anteriores mediante el comando gcloud compute instances create con las siguientes marcas:

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

Reemplaza lo siguiente:

  • VM_NAME: el nombre de la VM.

  • IMAGE_FAMILY: Es la familia de imágenes del sistema operativo con la que se inicializará el disco de arranque. Como alternativa, puedes especificar la marca --image=IMAGE y reemplazar IMAGE por una versión específica de una imagen. Aprende a ver una lista de imágenes disponibles en el proyecto de imágenes de Compute Engine.

  • IMAGE_PROJECT: El nombre del proyecto de imagen que contiene la imagen de disco.

  • MACHINE_TYPE: un tipo de máquina, predefinido o personalizado de la VM.

  • VNIC_TYPE: El tipo de vNIC que se usará para el plano de control y las redes del plano de datos. El valor debe ser uno de los siguientes:

    • Para usar gVNIC, especifica GVNIC.

    • Para usar VirtIO-Net, especifica VIRTIO_NET.

  • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que creaste en los pasos anteriores.

  • CONTROL_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de control que creaste en los pasos anteriores

  • DATA_PLANE_NETWORK_NAME: El nombre de la red del plano de datos que creaste en los pasos anteriores.

  • DATA_PLANE_SUBNET_NAME: El nombre de la subred de la red del plano de control que creaste de forma automática en los pasos anteriores.

  • ZONE: La zona en la que se creará la VM. Especifica una zona dentro de la misma región de la subred que creaste en los pasos anteriores.

Por ejemplo, para crear una VM llamada dpdk-vm en la zona us-central1-a que especifica un disco persistente SSD de 512 GB, un tipo de máquina C2 predefinido con 60 CPUs virtuales, herramientas de redes de nivel 1 y datos de plano de control y una red del plano de control que usen gVNIC, ejecuta el siguiente 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

Crea una VM que use las dos subredes de red de VPC que creaste en los pasos anteriores mediante una solicitud POST al método instances.insert con los siguientes 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"
    }
  ]
}

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto en el que se encuentran la red de VPC del plano de control y la red de VPC del plano de datos.

  • ZONE: La zona en la que se creará la VM.

  • VM_NAME: el nombre de la VM.

  • MACHINE_TYPE: un tipo de máquina, predefinido o personalizado de la VM.

  • IMAGE_PROJECT: El nombre del proyecto de imagen que contiene la imagen de disco.

  • IMAGE_FAMILY: Es la familia de imágenes del sistema operativo con la que se inicializará el disco de arranque. Como alternativa, puedes especificar una versión específica de una imagen. Aprende a ver una lista de imágenes en el proyecto de imágenes de Compute Engine.

  • CONTROL_PLANE_NETWORK_NAME: El nombre de la red del plano de control que creaste en los pasos anteriores.

  • REGION: La región en la que existen las subredes del plano de control y las redes del plano de datos.

  • CONTROL_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de control que creaste en los pasos anteriores

  • VNIC_TYPE: El tipo de vNIC que se usará para el plano de control y las redes del plano de datos. El valor debe ser uno de los siguientes:

    • Para usar gVNIC, especifica GVNIC.

    • Para usar VirtIO-Net, especifica VIRTIO_NET.

  • DATA_PLANE_NETWORK_NAME: El nombre de la red del plano de datos que creaste en los pasos anteriores.

  • DATA_PLANE_SUBNET_NAME: El nombre de la subred para la red del plano de control que creaste en los pasos anteriores

Por ejemplo, para crear una VM llamada dpdk-vm en la zona us-central1-a que especifica un disco persistente SSD de 512 GB, un tipo de máquina C2 predefinido con 60 CPUs virtuales, herramientas de redes de nivel 1 y datos plano y una red del plano de control que usen gVNIC, realiza la siguiente solicitud 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 obtener más opciones de configuración cuando creas una VM, consulta Crea e inicia una instancia de VM.

Instala DPDK en tu VM

Para instalar el DPDK en tu VM, sigue estos pasos:

  1. Conéctate a la VM que creaste en la sección anterior mediante SSH.

  2. Configura las dependencias para la instalación de 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. Instala 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 compilar el DPDK con los ejemplos, sigue estos pasos:

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

Instala el controlador

Si deseas preparar el DPDK para que se ejecute en un controlador, instala el controlador mediante uno de los siguientes métodos:

Instala una VFIO sin IOMMU

Para instalar el controlador de VFIO sin IOMMU, sigue estos pasos:

  1. Verifica si VFIO está habilitado:

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

    Si VFIO no está habilitado, sigue los pasos en Instala la IUO.

  2. Habilita el modo No-IOMMU en VFIO:

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

Instala IUO

Para instalar el controlador de IUO en DPDK, selecciona uno de los siguientes métodos:

Instala la IUO mediante Git

Para instalar el controlador de IUO en DPDK mediante git, sigue estos pasos:

  1. Clona el repositorio de git igb_uio en un disco de tu VM:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. Desde el directorio superior del repositorio de git clonado, compila el módulo y, luego, instala el controlador de IUO en DPDK:

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

Instala IUO mediante paquetes de Linux

Para instalar el controlador de IUO en DPDK mediante paquetes de Linux, sigue estos pasos:

  1. Instala el paquetedpdk-igb-uio-dkms:

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. Instala el controlador de IUO en DPDK:

    sudo modprobe igb_uio
    

Vincula el DPDK a un controlador y pruébalo

Para vincular el DPDK al controlador que instalaste en la sección anterior, sigue estos pasos:

  1. Obtén el número de ranura de la interconexión de componentes periféricos (PCI) para la interfaz de red actual:

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

    Por ejemplo, si la VM usa ens4 como la interfaz de red, el número de ranura de PCI es 00:04.0.

  2. Detén la interfaz de red conectada al adaptador de red:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    Reemplaza NETWORK_INTERFACE_NAME por el nombre de la interfaz de red especificada en las redes de VPC. Para ver qué interfaz de red usa la VM, consulta la configuración de la interfaz de red:

    sudo ifconfig
    
  3. Vincula el DPDK al controlador:

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

    Reemplaza lo siguiente:

    • DRIVER: el controlador para vincular DPDK. Especifica uno de los siguientes valores:

      • Controlador de IUO: igb_uio

      • Controlador de VFIO sin IOMMU: vfio-pci

    • PCI_SLOT_NUMBER: El número de ranura de PCI de la interfaz de red actual con formato 00:0NUMBER.0.

  4. Crea el directorio /mnt/huge y, luego, crea algunas hugepages para que DPDK se use en búferes:

    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. Prueba que el DPDK pueda usar la interfaz de red que creaste en los pasos anteriores mediante la ejecución de la aplicación de ejemplo testpmd que se incluye con las bibliotecas de DPDK:

    sudo ./build/app/dpdk-testpmd
    

    Para obtener más información sobre las pruebas de DPDK, consulta Opciones de línea de comandos de Testpmd.

Desvincula el DPDK

Después de usar el DPDK, puedes desvincularlo del controlador que instalaste en la sección anterior. Para desvincular el DPDK, sigue estos pasos:

  1. Desvincula el DPDK del controlador:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    Reemplaza PCI_SLOT_NUMBER por el número de ranura de PCI que especificaste en los pasos anteriores. Si deseas verificar el número de ranura de PCI para la interfaz de red actual, haz lo siguiente:

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

    Por ejemplo, si la VM usa ens4 como la interfaz de red, el número de ranura de PCI es 00:04.0.

  2. Vuelve a cargar el controlador de red de Compute Engine:

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

    Reemplaza lo siguiente:

    • PCI_SLOT_NUMBER: el número de ranura de PCI que especificaste en los pasos anteriores.

    • VNIC_DIRECTORY: el directorio del vNIC. Según el tipo de vNIC que uses, especifica uno de los siguientes valores:

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

    • NETWORK_INTERFACE_NAME: el nombre de la interfaz de red que especificaste en la sección anterior.

¿Qué sigue?