Schnellere Verarbeitung von Netzwerkpaketen mit DPDK ermöglichen


In diesem Dokument wird beschrieben, wie Sie das Data Plane Development Kit (DPDK) auf einer VM-Instanz (virtuelle Maschine) aktivieren, um die Netzwerkpaketverarbeitung zu beschleunigen.

DPDK ist ein Framework für leistungsintensive Anwendungen, die eine schnelle Paketverarbeitung, eine geringe Latenz und eine gleichbleibende Leistung erfordern. DPDK bietet eine Reihe an Bibliotheken auf Datenebene und einen Netzwerkschnittstellen-Controller (NIC). Diese Elemente umgehen das Kernel-Netzwerk und werden direkt im Nutzerbereich ausgeführt. Das Aktivieren von DPDK auf Ihrer VM ist beispielsweise bei folgenden Anwendungen nützlich:

  • Bereitstellungen der Netzwerkfunktionsvirtualisierung (NFV)

  • Software-definierte Netzwerke (SDN)

  • Videostreaming- oder Voice-over-IP-Anwendungen

Sie können DPDK auf einer VM mit einem der folgenden vNIC-Typen (virtuelle NIC) ausführen:

  • Empfohlen: gVNIC

    Eine leistungsstarke, sichere und skalierbare virtuelle Netzwerkschnittstelle, die speziell für die Compute Engine entwickelt wurde und virtIO als vNIC der nächsten Generation ablöst.

  • VirtIO-Net

    Ein Open-Source-Ethernet-Treiber, mit dem VMs effizient auf physische Hardware wie Blockspeicher und Netzwerkadapter zugreifen können.

Ein Problem beim Ausführen von DPDK in einer virtuellen Umgebung anstelle von physischer Hardware ist, dass virtuelle Umgebungen keine Unterstützung für SR-IOV und I/O Memory Management Unit (IOMMU) für leistungsstarke Anwendungen bieten. Um diese Einschränkung zu überwinden, müssen Sie DPDK mit einem der folgenden Treiber auf physischen Gastadressen statt auf virtuellen Hostadressen ausführen:

Hinweise

  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich bei Compute Engine authentifizieren. Wählen Sie dazu eine der folgenden Optionen aus:

    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. Install the Google Cloud CLI, then initialize it by running the following command:

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

      Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Weitere Informationen finden Sie unter Für die Verwendung von REST authentifizieren in der Dokumentation zur Google Cloud-Authentifizierung.

Voraussetzungen

Beachten Sie beim Erstellen einer VM, auf der DPDK ausgeführt werden soll, Folgendes:

  • Verwenden Sie zwei Virtual Private Cloud-Netzwerke, um beim Ausführen Ihrer Anwendungen einen Ausfall der Netzwerkverbindung zu vermeiden:

    • Ein VPC-Netzwerk für die Steuerungsebene

    • Ein VPC-Netzwerk für die Datenebene

  • Beide VPC-Netzwerke müssen Folgendes angeben:

    • Ein Subnetz mit einem eindeutigen IP-Adressbereich

    • dieselbe Region für ihre Subnetze

    • Derselbe vNIC-Typ – entweder gVNIC oder VirtIO-Net

  • Beim Erstellen der VM:

    • Sie müssen dieselbe Region angeben wie die Subnetze der beiden VPC-Netzwerke.

    • Sie müssen den vNIC-Typ angeben, den Sie mit DPDK verwenden möchten.

    • Sie müssen eine unterstützte Maschinenserie für gVNIC oder VirtIO-Net angeben.

Einschränkungen

Für die Ausführung von DPDK auf einer VM gelten folgende Einschränkungen:

  • Sie können Single-Stack-Subnetze nur für die beiden in der VM verwendeten VPC-Netzwerke nutzen.

  • Wenn Sie gVNIC als vNIC-Typ für die beiden VPC-Netzwerke verwenden, müssen Sie Folgendes beachten:

  • Wenn Sie beim Erstellen der VM die Netzwerkleistung pro VM-Tier_1 für eine höhere Netzwerkleistung aktivieren möchten, müssen Sie Folgendes angeben:

VM für die Ausführung von DPDK konfigurieren

In diesem Abschnitt wird erläutert, wie Sie eine VM erstellen, auf der DPDK ausgeführt werden kann.

VPC-Netzwerke erstellen

Erstellen Sie über die Google Cloud Console, die Google Cloud CLI oder die Compute Engine API zwei VPC-Netzwerke für die Datenebene und die Steuerungsebene. Sie können diese Netzwerke später beim Erstellen der VM angeben.

Console

  1. Erstellen Sie ein VPC-Netzwerk für die Datenebene:

    1. Wechseln Sie in der Google Cloud Console zu VPC-Netzwerke.

      Zur Seite VPC-Netzwerke

      Die Seite VPC-Netzwerke wird geöffnet.

    2. Klicken Sie auf VPC-Netzwerk erstellen.

      Die Seite VPC-Netzwerk erstellen wird geöffnet.

    3. Geben Sie im Feld Name einen Namen für Ihr Netzwerk ein.

    4. Führen Sie im Bereich Neues Subnetz die folgenden Schritte aus:

      1. Geben Sie im Feld Name einen Namen für Ihr Subnetz ein.

      2. Wählen Sie im Menü Region eine Region für das Subnetz aus.

      3. Wählen Sie IPv4 (Single-Stack) (Standardeinstellung) aus.

      4. Geben Sie im Feld IPv4-Bereich eine gültige IPv4-Adresse in CIDR-Notation ein.

      5. Klicken Sie auf Fertig.

    5. Klicken Sie auf Erstellen.

      Die Seite VPC-Netzwerke wird geöffnet. Es kann bis zu einer Minute dauern, bis das VPC-Netzwerk erstellt ist.

  2. Erstellen Sie ein VPC-Netzwerk für die Steuerungsebene mit einer Firewallregel, die SSH-Verbindungen zur VM zulässt:

    1. Klicken Sie noch einmal auf VPC-Netzwerk erstellen.

      Die Seite VPC-Netzwerk erstellen wird geöffnet.

    2. Geben Sie im Feld Name einen Namen für Ihr Netzwerk ein.

    3. Führen Sie im Bereich Neues Subnetz die folgenden Schritte aus:

      1. Geben Sie im Feld Name einen Namen für das Subnetz ein.

      2. Wählen Sie im Menü Region dieselbe Region aus, die Sie für das Subnetz des Dataplane-Netzwerks angegeben haben.

      3. Wählen Sie IPv4 (Single-Stack) (Standardeinstellung) aus.

      4. Geben Sie im Feld IPv4-Bereich eine gültige IPv4-Adresse in CIDR-Notation ein.

      5. Klicken Sie auf Fertig.

    4. Markieren Sie auf dem Tab IPv4-Firewallregeln das Kästchen NETWORK_NAME-allow-ssh.

      Dabei ist NETWORK_NAME der Netzwerkname, den Sie in den vorherigen Schritten angegeben haben.

    5. Klicken Sie auf Erstellen.

      Die Seite VPC-Netzwerke wird geöffnet. Es kann bis zu einer Minute dauern, bis das VPC-Netzwerk erstellt ist.

gcloud

  1. So erstellen Sie ein VPC-Netzwerk für die Datenebene:

    1. Erstellen Sie ein VPC-Netzwerk mit einem manuell erstellten Subnetz, indem Sie den gcloud compute networks create-Befehl verwenden, wobei das --subnet-mode-Flag auf custom gesetzt ist.

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

      Ersetzen Sie Folgendes:

      • DATA_PLANE_NETWORK_NAME: Den Namen des VPC-Netzwerks für die Datenebene.

      • MTU: Die maximale Übertragungseinheit (MTU), also die größte Paketgröße des Netzwerks. Der Wert muss zwischen 1300 und 8896 liegen. Der Standardwert ist 1460. Bevor Sie die MTU auf einen höheren Wert als 1460 setzen, lesen Sie die Informationen unter Maximale Übertragungseinheit.

    2. Erstellen Sie mit dem gcloud compute networks subnets create-Befehl ein Subnetz für das gerade erstellte Netzwerk der VPC-Datenebene.

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

      Ersetzen Sie Folgendes:

      • DATA_PLANE_SUBNET_NAME: Den Namen des Subnetzes für das Datenebenennetzwerk.

      • DATA_PLANE_NETWORK_NAME: Den Namen des Netzwerks der Datenebene, das Sie in den vorherigen Schritten angegeben haben.

      • DATA_PRIMARY_RANGE: Ein gültiger IPv4-Bereich für das Subnetz in CIDR-Notation.

      • REGION: Die Region, in der das Subnetz erstellt werden soll.

  2. So erstellen Sie ein VPC-Netzwerk für die Steuerungsebene mit einer Firewallregel, die SSH-Verbindungen zur VM zuläßt:

    1. Erstellen Sie ein VPC-Netzwerk mit einem manuell erstellten Subnetz, indem Sie den gcloud compute networks create-Befehl verwenden, wobei das --subnet-mode-Flag auf custom gesetzt ist.

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

      Ersetzen Sie Folgendes:

      • CONTROL_PLANE_NETWORK_NAME: Der Namen des VPC-Netzwerks für die Steuerungsebene.

      • MTU: Die MTU, die die größte Paketgröße des Netzwerks ist. Der Wert muss zwischen 1300 und 8896 liegen. Der Standardwert ist 1460. Bevor Sie die MTU auf einen höheren Wert als 1460 setzen, lesen Sie die Informationen unter Maximale Übertragungseinheit.

    2. Erstellen Sie mit dem gcloud compute networks subnets create-Befehl ein Subnetz für das gerade erstellte Netzwerk der VPC-Steuerungsebene.

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

      Ersetzen Sie Folgendes:

      • CONTROL_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene.

      • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie in den vorherigen Schritten angegeben haben.

      • CONTROL_PRIMARY_RANGE: Ein gültiger IPv4-Bereich für das Subnetz in CIDR-Notation.

      • REGION: Die Region, in der das Subnetz erstellt werden soll. Sie muss mit der Region übereinstimmen, die Sie im Subnetz des Datenebenenetzwerks angegeben haben.

    3. Erstellen Sie eine VPC-Firewallregel, die SSH im Netzwerk der Steuerungsebene mit dem gcloud compute firewall-rules create-Befehl zulässt, wobei das --allow-Flag auf tcp:22 gesetzt ist.

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

      Ersetzen Sie Folgendes:

      • FIREWALL_RULE_NAME: Der Name der Firewallregel.

      • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie in den vorherigen Schritten erstellt haben.

API

  1. So erstellen Sie ein VPC-Netzwerk für die Datenebene:

    1. Erstellen Sie ein VPC-Netzwerk mit einem manuell erstellten Subnetz. Stellen Sie dazu eine POST-Anfrage an die networks.insert-Methode, wobei das autoCreateSubnetworks-Feld auf false gesetzt ist.

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

      Ersetzen Sie Folgendes:

      • PROJECT_ID: Die Projekt-ID des aktuellen Projekts.

      • DATA_PLANE_NETWORK_NAME: Der Name des Netzwerks für die Datenebene.

      • MTU: Die maximale Übertragungseinheit (MTU), also die größte Paketgröße des Netzwerks. Der Wert muss zwischen 1300 und 8896 liegen. Der Standardwert ist 1460. Bevor Sie die MTU auf einen höheren Wert als 1460 setzen, lesen Sie die Informationen unter Maximale Übertragungseinheit.

    2. Erstellen Sie ein Subnetz für das Netzwerk der VPC-Datenebene. Stellen Sie dazu eine POST-Anfrage an die subnetworks.insert-Methode.

      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"
      }
      

      Ersetzen Sie Folgendes:

      • PROJECT_ID: Die Projekt-ID des Projekts, in dem sich das Netzwerk der Datenebene befindet.

      • REGION: Die Region, in der Sie das Subnetz erstellen möchten.

      • DATA_PRIMARY_RANGE: Der primäre IPv4-Bereich für das neue Subnetz in CIDR-Notation.

      • DATA_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Datenebene, das Sie im vorherigen Schritt erstellt haben.

      • DATA_PLANE_NETWORK_NAME: Der Name des Datenebenennetzwerks, das Sie im vorherigen Schritt erstellt haben.

  2. So erstellen Sie ein VPC-Netzwerk für die Steuerungsebene mit einer Firewallregel, die SSH-Verbindungen zur VM zuläßt:

    1. Erstellen Sie ein VPC-Netzwerk mit einem manuell erstellten Subnetz. Stellen Sie dazu eine POST-Anfrage an die networks.insert-Methode, wobei das autoCreateSubnetworks-Feld auf false gesetzt ist.

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

      Ersetzen Sie Folgendes:

      • PROJECT_ID: Die Projekt-ID des aktuellen Projekts.

      • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks für die Steuerungsebene.

      • MTU: Die MTU, die die größte Paketgröße des Netzwerks ist. Der Wert muss zwischen 1300 und 8896 liegen. Der Standardwert ist 1460. Bevor Sie die MTU auf einen höheren Wert als 1460 setzen, lesen Sie die Informationen unter Maximale Übertragungseinheit.

    2. Erstellen Sie ein Subnetz für das VPC-Datenkontrollnetzwerk. Senden Sie dazu eine POST-Anfrage an die subnetworks.insert-Methode.

      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"
      }
      

      Ersetzen Sie Folgendes:

      • PROJECT_ID: Die Projekt-ID des Projekts, in dem sich das Netzwerk der Steuerungsebene befindet.

      • REGION: Die Region, in der Sie das Subnetz erstellen möchten.

      • CONTROL_PRIMARY_RANGE: Der primäre IPv4-Bereich für das neue Subnetz in CIDR-Notation.

      • CONTROL_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene, das Sie im vorherigen Schritt erstellt haben.

      • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie im vorherigen Schritt erstellt haben.

    3. Erstellen Sie eine VPC-Firewallregel, die SSH im Netzwerk der Steuerungsebene zulässt. Stellen Sie dazu eine POST-Anfrage an die firewalls.insert-Methode. Setzen Sie in der Anfrage das IPProtocol-Feld auf tcp und das ports-Feld auf 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"
      }
      

      Ersetzen Sie Folgendes:

      • PROJECT_ID: Die Projekt-ID des Projekts, in dem sich das Netzwerk der Steuerungsebene befindet.

      • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie in den vorherigen Schritten erstellt haben.

Weitere Konfigurationsoptionen beim Erstellen eines VPC-Netzwerk finden Sie unter VPC-Netzwerke erstellen und verwalten.

VM erstellen, die die VPC-Netzwerke für DPDK verwendet

Erstellen Sie eine VM, die gVNIC oder virtIO-Net in den beiden VPC-Netzwerken aktiviert, die Sie zuvor mit der Google Cloud Console, der gcloud CLI oder der Compute Engine API erstellt haben.

Empfohlen: Geben Sie Ubuntu LTS oder Ubuntu Pro als Betriebssystem-Image an, da es dessen Paketmanager unterstützt, um die UIO und IOMMU-freien VFIO-Treiber zu unterstützen. Wenn Sie keines dieser Betriebssysteme angeben möchten, wird für eine schnellere Paketverarbeitung Debian 11 oder höher empfohlen.

Console

So erstellen Sie eine VM, die die beiden in den vorherigen Schritten erstellten VPC-Netzwerk-Subnetze verwendet:

  1. Rufen Sie in der Google Cloud Console VM-Instanzen auf.

    Zur Seite „VM-Instanzen“

    Die Seite VM-Instanzen wird geöffnet.

  2. Klicken Sie auf Instanz erstellen.

    Die Seite Instanz erstellen wird geöffnet.

  3. Geben Sie im Feld Name einen Namen für Ihre VM ein.

  4. Wählen Sie im Menü Region dieselbe Region aus, in der Sie in den vorherigen Schritten Ihre Netzwerke erstellt haben.

  5. Wählen Sie im Menü Zone eine Zone für Ihre VM aus.

  6. Führen Sie im Abschnitt Maschinenkonfiguration die folgenden Schritte aus:

    1. Wählen Sie eine der folgenden Optionen aus:

      • Wählen Sie für allgemeine Arbeitslasten den Tab Allgemein (Standardeinstellung).

      • Wählen Sie für leistungsintensive Arbeitslasten den Tab Computing-optimiert.

      • Wählen Sie für große Arbeitsspeicher-zu-vCPUs-Verhältnisse den Tab Speicheroptimiert.

      • Wählen Sie für Arbeitslasten, die GPUs verwenden, den Tab GPUs.

    2. Optional. Wenn Sie im vorherigen Schritt GPUs angegeben haben und die GPU ändern möchten, damit sie der VM hinzugefügt wird, führen Sie auf eine der folgenden Weisen vor:

      1. Wählen Sie im Menü GPU-Typ einen GPU-Typ.

      2. Wählen Sie im Menü Anzahl der GPUs die Anzahl der GPUs aus.

    3. Wählen Sie im Menü Reihe eine Maschinenserie.

    4. Wählen Sie im Menü Maschinentyp einen Maschinentyp.

    5. Optional: Maximieren Sie Erweiterte Konfigurationen und folgen Sie den Eingabeaufforderungen, um die Maschine für diese VM weiter anzupassen.

  7. Optional: Klicken Sie im Abschnitt Bootlaufwerk auf Ändern und folgen Sie den Aufforderungen zum Ändern des Speicherabbilds.

  8. Maximieren Sie den Bereich Erweiterte Optionen.

  9. Maximieren Sie den Bereich Netzwerk.

  10. Führen Sie im Abschnitt Konfiguration der Netzwerkleistung die folgenden Schritte aus:

    1. Wählen Sie im Menü Netzwerkkarte eine der folgenden Optionen aus:

      • Wenn Sie gVNIC verwenden möchten, wählen Sie gVNIC aus.

      • Wenn Sie VirtIO-Net verwenden möchten, wählen Sie VirtIO aus.

    2. Optional: Markieren Sie für eine höhere Netzwerkleistung und geringere Latenz das Kästchen Tier_1-Netzwerk aktivieren.

  11. Führen Sie im Bereich Netzwerkschnittstellen folgende Schritte aus:

    1. Klicken Sie in der Zeile standard auf Element „standard“ löschen.

    2. Klicken Sie auf Netzwerkschnittstelle hinzufügen.

      Der Bereich Neue Netzwerkschnittstelle wird angezeigt.

    3. Wählen Sie im Menü Netzwerk das Steuerungsebenen-Netzwerk aus, das Sie in den vorherigen Schritten erstellt haben.

    4. Klicken Sie auf Fertig.

    5. Klicken Sie noch einmal auf Netzwerkschnittstelle hinzufügen.

      Der Bereich Neue Netzwerkschnittstelle wird angezeigt.

    6. Wählen Sie im Menü Netzwerk das Dataplane-Netzwerk aus, das Sie in den vorherigen Schritten erstellt haben.

    7. Klicken Sie auf Fertig.

  12. Klicken Sie auf Erstellen.

    Die Seite VM-Instanzen wird geöffnet. Es kann bis zu einer Minute dauern, bis die VM erstellt ist.

gcloud

Erstellen Sie mit dem gcloud compute instances create-Befehl und den folgenden Flags eine VM, die die beiden VPC-Netzwerk-Subnetze verwendet, die Sie in den vorherigen Schritten erstellt haben:

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

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name der VM.

  • IMAGE_FAMILY: die Image-Familie für das Betriebssystem, mit dem das Bootlaufwerk initialisiert wird. Alternativ können Sie das --image=IMAGE-Flag angeben und IMAGE durch eine bestimmte Version eines Images ersetzen. Liste der im Compute Engine-Image-Projekt verfügbaren Images anzeigen.

  • IMAGE_PROJECT ist der Name des Image-Projekts, das das Speicherabbild enthält.

  • MACHINE_TYPE: Ein vordefinierter oder benutzerdefinierter Maschinentyp für die VM.

  • VNIC_TYPE: Der vNIC-Typ, der für die Netzwerke auf Steuerungs- und Datenebene verwendet werden soll. Der Wert muss einer der folgenden sein:

    • Geben Sie GVNIC an, um gVNIC zu verwenden.

    • Geben Sie VIRTIO_NET an, um VirtIO-Net zu verwenden.

  • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie in den vorherigen Schritten erstellt haben.

  • CONTROL_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene, das Sie im vorherigen Schritt erstellt haben.

  • DATA_PLANE_NETWORK_NAME: Der Name des Datenebenennetzwerks, das Sie im vorherigen Schritt erstellt haben.

  • DATA_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene, das Sie in den vorherigen Schritten automatisch erstellt haben.

  • ZONE: Die Zone, in der die VM erstellt werden soll. Geben Sie eine Zone in der Region des Subnetzes an, das Sie in den vorherigen Schritten erstellt haben.

Um beispielsweise eine VM namens dpdk-vm in der Zone us-central1-a zu erstellen, die einen nichtflüchtigen SSD-Speicher mit 512 GB, einen vordefinierten C2-Maschinentyp mit 60 vCPUs, ein Tier_1-Netzwerk, ein Daten- und ein Steuerungsebenennetzwerk angibt, die beide gVNIC verwenden, führen Sie folgenden Befehl aus:

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

Erstellen Sie eine VM, die die beiden in den vorherigen Schritten erstellten VPC-Netzwerk-Subnetze verwendet. Stellen Sie dazu eine POST-Anfrage an die instances.insert-Methode mit folgenden Feldern:

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"
    }
  ]
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: Die Projekt-ID des Projekts, in dem sich die VPC-Netzwerke der Steuerungsebene und der Datenebene befinden.

  • ZONE: Die Zone, in der die VM erstellt werden soll.

  • VM_NAME ist der Name der VM.

  • MACHINE_TYPE: Ein vordefinierter oder benutzerdefinierter Maschinentyp für die VM.

  • IMAGE_PROJECT ist der Name des Image-Projekts, das das Speicherabbild enthält.

  • IMAGE_FAMILY: die Image-Familie für das Betriebssystem, mit dem das Bootlaufwerk initialisiert wird. Alternativ können Sie eine bestimmte Version eines Bildes angeben. Liste der Images im Projekt mit Compute Engine-Images anzeigen.

  • CONTROL_PLANE_NETWORK_NAME: Der Name des Netzwerks der Steuerungsebene, das Sie in den vorherigen Schritten erstellt haben.

  • REGION: Die Region, in der sich die Subnetze der Steuerungsebenen- und Datenebenennetzwerke befinden

  • CONTROL_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene, das Sie im vorherigen Schritt erstellt haben.

  • VNIC_TYPE: Der vNIC-Typ, der für die Netzwerke auf Steuerungs- und Datenebene verwendet werden soll. Der Wert muss einer der folgenden sein:

    • Geben Sie GVNIC an, um gVNIC zu verwenden.

    • Geben Sie VIRTIO_NET an, um VirtIO-Net zu verwenden.

  • DATA_PLANE_NETWORK_NAME: Der Name des Datenebenennetzwerks, das Sie im vorherigen Schritt erstellt haben.

  • DATA_PLANE_SUBNET_NAME: Der Name des Subnetzes für das Netzwerk der Steuerungsebene, das Sie im vorherigen Schritt erstellt haben.

Um beispielsweise eine VM namens dpdk-vm in der Zone us-central1-a zu erstellen, die einen nichtflüchtigen SSD-Speicher mit 512 GB, einen vordefinierten C2-Maschinentyp mit 60 vCPUs, ein Tier_1-Netzwerk, ein Daten- und ein Steuerungsebenennetzwerk angibt, die beide gVNIC verwenden, führen Sie folgenden POST-Befehl aus:

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"
  }
}

Weitere Konfigurationsoptionen zum Erstellen einer VM finden Sie unter VM-Instanz erstellen und starten.

DPDK auf der VM installieren

So installieren Sie DPDK auf Ihrer VM:

  1. Stellen Sie über SSH eine Verbindung zur VM her, die Sie im vorherigen Abschnitt erstellt haben.

  2. Konfigurieren Sie die Abhängigkeiten für die DPDK-Installation:

    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. Installieren Sie DPDK:

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. So erstellen Sie DPDK mit den Beispielen:

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

Treiber installieren.

Um DPDK für die Ausführung auf einem Treiber vorzubereiten, installieren Sie den Treiber mit einer der folgenden Methoden:

IOMMU-freie VFIO installieren

So installieren Sie den IOMMU-freien VFIO-Treiber:

  1. Prüfen, ob VFIO aktiviert ist:

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

    Wenn VFIO nicht aktiviert ist, folgen Sie der Anleitung unter UIO installieren.

  2. Aktivieren Sie in VFIO den Kein-IOMMU-Modus:

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

UIO installieren

Wählen Sie eine der folgenden Methoden, um den UIO-Treiber auf DPDK zu installieren:

UIO mit Git installieren

So installieren Sie den UIO-Treiber mit git auf DPDK:

  1. Klonen Sie das igb_uio-Git-Repository auf einen Datenträger in Ihrer VM:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. Erstellen Sie das Modul im übergeordneten Verzeichnis des geklonten Git-Repositorys und installieren Sie den UIO-Treiber auf DPDK:

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

UIO mit Linux-Paketen installieren

So installieren Sie den UIO-Treiber auf DPDK mit Linux-Paketen:

  1. dpdk-igb-uio-dkms-Paket installieren:

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. So installieren Sie den UIO-Treiber auf DPDK:

    sudo modprobe igb_uio
    

DPDK an einen Treiber binden und testen

So binden Sie DPDK an den im vorherigen Abschnitt installierten Treiber:

  1. Rufen Sie die PCI-Steckplatznummer (Peripheral Component Interconnect) für die aktuelle Netzwerkschnittstelle ab:

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

    Beispiel: Wenn die VM ens4 als Netzwerkschnittstelle verwendet, ist die PCI-Slotnummer 00:04.0.

  2. Beenden Sie die mit dem Netzwerkadapter verbundene Netzwerkschnittstelle:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    Ersetzen Sie NETWORK_INTERFACE_NAME durch den Namen der Netzwerkschnittstelle, die in den VPC-Netzwerken angegeben ist. Um zu sehen, welche Netzwerkschnittstelle die VM verwendet, rufen Sie die Konfiguration der Netzwerkschnittstelle auf:

    sudo ifconfig
    
  3. Binden Sie DPDK an den Treiber:

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

    Ersetzen Sie Folgendes:

    • DRIVER: der Treiber, an den DPDK gebunden werden soll. Geben Sie einen der folgenden Werte an:

      • UIO-Treiber: igb_uio

      • IOMMU-freier VFIO-Treiber: vfio-pci

    • PCI_SLOT_NUMBER: die PCI-Steckplatznummer der aktuellen Netzwerkschnittstelle im Format 00:0NUMBER.0.

  4. Erstellen Sie das /mnt/huge-Verzeichnis und dann einige Hugepages für DPDK zur Verwendung als Zwischenspeicher:

    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. Testen Sie, ob DPDK die in den vorherigen Schritten erstellte Netzwerkschnittstelle verwenden kann. Führen Sie dazu die in den DPDK-Bibliotheken enthaltene Beispielanwendung testpmd aus:

    sudo ./build/app/dpdk-testpmd
    

    Weitere Informationen zum Testen von DPDK finden Sie unter Testpmd-Befehlszeilenoptionen.

DPDK-Bindung aufheben

Nachdem Sie DPDK verwendet haben, können Sie die Bindung zum Treiber aufheben, den Sie im vorherigen Abschnitt installiert haben. So heben Sie die Bindung von DPDK auf:

  1. DPDK vom Treiber entkoppeln:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    Ersetzen Sie PCI_SLOT_NUMBER durch die PCI-Steckplatznummer, die Sie in den vorherigen Schritten angegeben haben. So prüfen Sie die PCI-Steckplatznummer für die aktuelle Netzwerkschnittstelle:

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

    Beispiel: Wenn die VM ens4 als Netzwerkschnittstelle verwendet, ist die PCI-Slotnummer 00:04.0.

  2. Laden Sie den Compute Engine-Netzwerktreiber neu:

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

    Ersetzen Sie Folgendes:

    • PCI_SLOT_NUMBER: die PCI-Steckplatznummer, die Sie in den vorherigen Schritten angegeben haben.

    • VNIC_DIRECTORY: Das Verzeichnis des vNIC. Geben Sie je nach verwendetem vNIC-Typ einen der folgenden Werte an:

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

    • NETWORK_INTERFACE_NAME: Der Name der Netzwerkschnittstelle, die Sie im vorherigen Abschnitt angegeben haben.

Nächste Schritte