DPDK によるネットワーク パケット処理を高速化する


このドキュメントでは、仮想マシン(VM)インスタンスでデータプレーン開発キット(DPDK)を有効にして、ネットワーク パケット処理を高速化する方法について説明します。

DPDK は、高速パケット処理、低レイテンシ、一貫性のあるパフォーマンスを必要とするパフォーマンス重視のアプリケーションに対応したフレームワークです。DPDK は、カーネル ネットワークをバイパスし、ユーザー空間で直接実行するデータプレーン ライブラリとネットワーク インターフェース コントローラ(NIC)のセットを提供します。たとえば、VM で DPDK を有効にすると、次のものを実行する際に便利です。

  • ネットワーク機能の仮想化(NFV)のデプロイ

  • ソフトウェア定義ネットワーキング(SDN)アプリケーション

  • 動画ストリーミングや Voice over IP アプリケーション

VM では、次のいずれかの仮想 NIC(vNIC)タイプを使用して DPDK を実行できます。

  • 推奨: gVNIC

    virtIO の後継となる次世代の vNIC として、Compute Engine に特化して設計された、高パフォーマンス、安全、スケーラブルな仮想ネットワーク インターフェース。

  • VirtIO-Net

    ブロック ストレージやネットワーク アダプタなどの物理ハードウェアに VM が効率的にアクセスできるようにするオープンソースのイーサネット ドライバ。

DPDK を物理ハードウェアではなく仮想環境で実行する場合の問題のひとつとして、仮想環境では高パフォーマンスのアプリケーションに対して SR-IOV と I/O メモリ管理ユニット(IOMMU)がサポートされていないことが挙げられます。この制限を回避するには、次のいずれかのドライバを使用して、ホスト仮想アドレスではなくゲスト物理アドレスで DPDK を実行する必要があります。

準備

  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init

要件

DPDK を実行する VM を作成する際は、次のことを確認してください。

  • アプリケーションの実行時にネットワーク接続が失われる状況を回避するには、次の 2 つの Virtual Private Cloud ネットワークを使用します。

    • コントロール プレーン用の VPC ネットワーク

    • データプレーン用の VPC ネットワーク

  • 2 つの VPC ネットワークの両方で、次の項目を指定する必要があります。

    • 一意の IP アドレス範囲を持つサブネット

    • サブネットと同じリージョン

    • 同じタイプの VNIC(gVNIC または VirtIO-Net)

  • VM の作成時は、次の点に留意します。

    • 2 つの VPC ネットワークのサブネットと同じリージョンを指定する必要があります。

    • DPDK で使用する vNIC タイプを指定する必要があります。

    • gVNIC または VirtIO-Net に対してサポートされているマシンシリーズを指定する必要があります。

制限事項

VM で DPDK を実行する際は、次の制限があります。

DPDK を実行するように VM を構成する

このセクションでは、DPDK を実行する VM を作成する方法について説明します。

VPC ネットワークを作成する

Google Cloud コンソール、Google Cloud CLI、Compute Engine API のいずれかを使用して、データプレーンとコントロール プレーンの 2 つの VPC ネットワークを作成します。これらのネットワークは、後で VM を作成するときに指定できます。

コンソール

  1. データプレーン用の VPC ネットワークを作成します。

    1. Google Cloud コンソールで、[VPC ネットワーク] に移動します。

      [VPC ネットワーク] に移動

      [VPC ネットワーク] ページが開きます。

    2. [ VPC ネットワークを作成] をクリックします。

      [VPC ネットワークの作成] ページが開きます。

    3. [名前] フィールドに、ネットワークの名前を入力します。

    4. [新しいサブネット] セクションで、次の操作を行います。

      1. [名前] フィールドに、サブネットの名前を入力します。

      2. [リージョン] メニューで、サブネットのリージョンを選択します。

      3. [IPv4(シングルスタック)](デフォルト)を選択します。

      4. [IPv4 範囲] に、CIDR 表記の有効な IPv4 範囲のアドレスを入力します。

      5. [完了] をクリックします。

    5. [作成] をクリックします。

      [VPC ネットワーク] ページが開きます。VPC ネットワークの作成が完了するまでに 1 分ほどかかることがあります。

  2. VM への SSH 接続を許可するファイアウォール ルールを設定して、コントロール プレーン用の VPC ネットワークを作成します。

    1. もう一度 [ VPC ネットワークを作成] をクリックします。

      [VPC ネットワークの作成] ページが開きます。

    2. [名前] フィールドに、ネットワークの名前を入力します。

    3. [新しいサブネット] セクションで、次の操作を行います。

      1. [名前] フィールドに、サブネットの名前を入力します。

      2. [リージョン] メニューで、データプレーン ネットワークのサブネットに指定したものと同じリージョンを選択します。

      3. [IPv4(シングルスタック)](デフォルト)を選択します。

      4. [IPv4 範囲] に、CIDR 表記の有効な IPv4 範囲のアドレスを入力します。

      5. [完了] をクリックします。

    4. [IPv4 ファイアウォール ルール] タブで、[NETWORK_NAME-allow-ssh] チェックボックスをオンにします。

      NETWORK_NAME は、前の手順で指定したネットワーク名です。

    5. [作成] をクリックします。

      [VPC ネットワーク] ページが開きます。VPC ネットワークの作成が完了するまでに 1 分ほどかかることがあります。

gcloud

  1. データプレーン用の VPC ネットワークを作成する手順は次のとおりです。

    1. --subnet-mode フラグを custom に設定して gcloud compute networks create コマンドを使用し、手動で作成したサブネットで VPC ネットワークを作成します。

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

      次のように置き換えます。

      • DATA_PLANE_NETWORK_NAME: データプレーンの VPC ネットワークの名前。

      • MTU: ネットワークの最大パケットサイズである最大伝送単位(MTU)。値は 13008896 の範囲で指定する必要があります。デフォルト値は 1460 です。MTU を 1460 より大きい値に設定する前に、最大伝送単位を確認してください。

    2. gcloud compute networks subnets create コマンドを使用して、作成した VPC データプレーン ネットワークのサブネットを作成します。

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

      次のように置き換えます。

      • DATA_PLANE_SUBNET_NAME: データプレーン ネットワークのサブネットの名前。

      • DATA_PLANE_NETWORK_NAME: 前の手順で指定したデータプレーン ネットワークの名前。

      • DATA_PRIMARY_RANGE: CIDR 表記のサブネットの有効な IPv4 範囲

      • REGION: サブネットを作成するリージョン。

  2. VM への SSH 接続を許可するファイアウォール ルールを持つコントロール プレーン用の VPC ネットワークを作成するには、次の操作を行います。

    1. --subnet-mode フラグを custom に設定して gcloud compute networks create コマンドを使用し、手動で作成したサブネットで VPC ネットワークを作成します。

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

      次のように置き換えます。

      • CONTROL_PLANE_NETWORK_NAME: コントロール プレーンの VPC ネットワークの名前。

      • MTU: ネットワークの最大パケットサイズである MTU。値は 13008896 の範囲で指定する必要があります。デフォルト値は 1460 です。MTU を 1460 より大きい値に設定する前に、最大伝送単位を確認してください。

    2. gcloud compute networks subnets create コマンドを使用して、作成した VPC コントロール プレーン ネットワークのサブネットを作成します。

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

      次のように置き換えます。

      • CONTROL_PLANE_SUBNET_NAME: コントロール プレーン ネットワークのサブネットの名前。

      • CONTROL_PLANE_NETWORK_NAME: 前の手順で指定したコントロール プレーン ネットワークの名前。

      • CONTROL_PRIMARY_RANGE: CIDR 表記のサブネットの有効な IPv4 範囲

      • REGION: サブネットを作成するリージョン。データプレーン ネットワークのサブネットで指定したリージョンと一致している必要があります。

    3. --allow フラグを tcp:22 に設定して gcloud compute firewall-rules create コマンドを使用し、コントロール プレーン ネットワークへの SSH 接続を許可する VPC ファイアウォール ルールを作成します。

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

      次のように置き換えます。

      • FIREWALL_RULE_NAME: ファイアウォール ルールの名前。

      • CONTROL_PLANE_NETWORK_NAME: 前の手順で作成したコントロール プレーン ネットワークの名前。

API

  1. データプレーン用の VPC ネットワークを作成する手順は次のとおりです。

    1. autoCreateSubnetworks フィールドを false に設定して networks.insert メソッドに対し POST リクエストを発行し、手動で作成したサブネットを持つ VPC ネットワークを作成します。

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

      次のように置き換えます。

      • PROJECT_ID: 現在のプロジェクトのプロジェクト ID。

      • DATA_PLANE_NETWORK_NAME: データプレーンのネットワークの名前。

      • MTU: ネットワークの最大パケットサイズである最大伝送単位(MTU)。値は 13008896 の範囲で指定する必要があります。デフォルト値は 1460 です。MTU を 1460 より大きい値に設定する前に、最大伝送単位を確認してください。

    2. subnetworks.insert メソッドに対して POST リクエストを発行し、VPC データプレーン ネットワークのサブネットを作成します。

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

      次のように置き換えます。

      • PROJECT_ID: データプレーン ネットワークが配置されているプロジェクトのプロジェクト ID。

      • REGION: サブネットを作成するリージョン。

      • DATA_PRIMARY_RANGE: 新しいサブネットのプライマリ IPv4 範囲(CIDR 表記)。

      • DATA_PLANE_SUBNET_NAME: 前の手順で作成したデータプレーン ネットワークのサブネットの名前。

      • DATA_PLANE_NETWORK_NAME: 前の手順で作成したデータプレーン ネットワークの名前。

  2. VM への SSH 接続を許可するファイアウォール ルールを持つコントロール プレーン用の VPC ネットワークを作成するには、次の操作を行います。

    1. autoCreateSubnetworks フィールドを false に設定して networks.insert メソッドに対し POST リクエストを発行し、手動で作成したサブネットを持つ VPC ネットワークを作成します。

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

      次のように置き換えます。

      • PROJECT_ID: 現在のプロジェクトのプロジェクト ID。

      • CONTROL_PLANE_NETWORK_NAME: コントロール プレーンのネットワークの名前。

      • MTU: ネットワークの最大パケットサイズである MTU。値は 13008896 の範囲で指定する必要があります。デフォルト値は 1460 です。MTU を 1460 より大きい値に設定する前に、最大伝送単位を確認してください。

    2. subnetworks.insert メソッドに対して POST リクエストを発行し、VPC データ管理ネットワークのサブネットを作成します。

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

      次のように置き換えます。

      • PROJECT_ID: コントロール プレーン ネットワークが配置されているプロジェクトのプロジェクト ID。

      • REGION: サブネットを作成するリージョン。

      • CONTROL_PRIMARY_RANGE: 新しいサブネットのプライマリ IPv4 範囲(CIDR 表記)。

      • CONTROL_PLANE_SUBNET_NAME: 前の手順で作成したコントロール プレーン ネットワークのサブネットの名前。

      • CONTROL_PLANE_NETWORK_NAME: 前の手順で作成したコントロール プレーン ネットワークの名前。

    3. firewalls.insert メソッドに対して POST リクエストを発行し、コントロール プレーン ネットワークへの SSH 接続を許可する VPC ファイアウォール ルールを作成します。リクエストでは、IPProtocol フィールドを tcp に設定し、ports フィールドを 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"
      }
      

      次のように置き換えます。

      • PROJECT_ID: コントロール プレーン ネットワークが配置されているプロジェクトのプロジェクト ID。

      • CONTROL_PLANE_NETWORK_NAME: 前の手順で作成したコントロール プレーン ネットワークの名前。

VPC ネットワーク作成時のその他の構成オプションについては、VPC ネットワークを作成して管理するをご覧ください。

DPDK に VPC ネットワークを使用する VM を作成する

Google Cloud コンソール、gcloud CLI、Compute Engine API を使用して、以前に作成した 2 つの VPC ネットワークで gVNIC または virtIO-Net を有効にする VM を作成します。

推奨: パッケージ マネージャーが UIO と IOMMU-less VFIO ドライバをサポートしているため、オペレーティング システム イメージとして Ubuntu LTS または Ubuntu Pro を指定してください。これらのオペレーティング システムのいずれも指定しない場合は、パケット処理を高速化するために Debian 11 以降を指定することをおすすめします。

コンソール

次の手順を実施して、前の手順で作成した 2 つの VPC ネットワーク サブネットを使用する VM を作成します。

  1. Google Cloud コンソールで、[VM インスタンス] に移動します。

    [VM インスタンス] に移動

    [VM インスタンス] ページが開きます。

  2. [ インスタンスを作成] をクリックします。

    [インスタンスの作成] ページが開きます。

  3. [名前] フィールドに、VM の名前を入力します。

  4. [リージョン] メニューで、前の手順でネットワークを作成したリージョンと同じリージョンを選択します。

  5. [ゾーン] メニューで、VM のゾーンを選択します。

  6. [マシンの構成] セクションで、次の操作を行います。

    1. 次のオプションのいずれかを選択します。

      • 一般的なワークロードの場合は、[汎用] タブを選択します(デフォルト)。

      • 高いパフォーマンスが要求されるワークロードの場合は、[コンピューティング最適化] タブを選択します。

      • メモリ対 vCPU 比が高いワークロードの場合は、[メモリ最適化] タブを選択します。

      • 画像処理装置(GPU)を使用するワークロードの場合は、[GPU] タブを選択します。

    2. (省略可)前の手順で GPU を指定し、VM にアタッチする GPU を変更する場合は、次のいずれかまたは両方を行います。

      1. [GPU のタイプ] メニューで、GPU のタイプを選択します。

      2. [GPU の数] メニューで、GPU の数を選択します。

    3. [シリーズ] メニューで、マシンシリーズを選択します。

    4. [マシンタイプ] メニューでマシンタイプを選択します。

    5. 省略可: [高度な構成] を開き、画面の指示に沿って、この VM のマシンをさらにカスタマイズします。

  7. 省略可: [ブートディスク] セクションで [変更] をクリックし、画面の指示に沿ってディスク イメージを変更します。

  8. [詳細オプション] セクションを開きます。

  9. [ネットワーキング] セクションを開きます。

  10. [ネットワーク パフォーマンスの構成] セクションで、次の操作を行います。

    1. [ネットワーク インターフェース カード] メニューで、次のいずれかを選択します。

      • gVNIC を使用するには、[gVNIC] を選択します。

      • VirtIO-Net を使用するには、[VirtIO] を選択します。

    2. 省略可: ネットワーク パフォーマンスを向上させ、レイテンシを短縮するには、[VM ごとの Tier_1 ネットワーキング パフォーマンスを有効にする] チェックボックスをオンにします。

  11. [ネットワーク インターフェース] セクションで、次の操作を行います。

    1. default 行で、[ 「default」を削除します] をクリックします。

    2. [ネットワーク インターフェースを追加] をクリックします。

      [新しいネットワーク インターフェース] セクションが表示されます。

    3. [ネットワーク] メニューで、前の手順で作成したコントロール プレーン ネットワークを選択します。

    4. [完了] をクリックします。

    5. もう一度 [ネットワーク インターフェースを追加] をクリックします。

      [新しいネットワーク インターフェース] セクションが表示されます。

    6. [ネットワーク] メニューで、前の手順で作成したデータプレーン ネットワークを選択します。

    7. [完了] をクリックします。

  12. [作成] をクリックします。

    [VM インスタンス] ページが開きます。VM の作成が完了するまでに 1 分ほどかかることがあります。

gcloud

次のフラグを指定して gcloud compute instances create コマンドを使用し、前の手順で作成した 2 つの VPC ネットワーク サブネットを使用する VM を作成します。

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

次のように置き換えます。

  • VM_NAME: VM の名前。

  • IMAGE_FAMILY: ブートディスクの初期化に使用されるオペレーティング システムのイメージ ファミリー。また、--image=IMAGE フラグを指定することもできます(IMAGE の部分を特定のバージョンのイメージに置き換えます)。Compute Engine イメージ プロジェクトで使用可能なイメージのリストを表示する方法をご覧ください。

  • IMAGE_PROJECT: ディスク イメージを含むイメージ プロジェクトの名前。

  • MACHINE_TYPE: VM のマシンタイプ(事前定義またはカスタム)。

  • VNIC_TYPE: コントロール プレーンとデータプレーン ネットワークに使用する vNIC タイプ。値は次のいずれかにする必要があります。

    • gVNIC を使用するには、GVNIC を指定します。

    • VirtIO-Net を使用するには、VIRTIO_NET を指定します。

  • CONTROL_PLANE_NETWORK_NAME: 前の手順で作成したコントロール プレーン ネットワークの名前。

  • CONTROL_PLANE_SUBNET_NAME: 前の手順で作成したコントロール プレーン ネットワークのサブネットの名前。

  • DATA_PLANE_NETWORK_NAME: 前の手順で作成したデータプレーン ネットワークの名前。

  • DATA_PLANE_SUBNET_NAME: 前の手順で自動的に作成したコントロール プレーン ネットワークのサブネットの名前。

  • ZONE: VM を作成するゾーン。前の手順で作成したサブネットと同じリージョン内のゾーンを指定します。

たとえば、us-central1-a ゾーンに dpdk-vm という名前の VM を作成するとします。この VM で、512 GB の SSD 永続ディスク、60 個の vCPU を使用し、Tier_1 ネットワーキング、データプレーンとコントロール プレーン(どちらも gVNIC を使用)のネットワークを備えた事前定義の C2 マシンタイプを指定する場合は、次のコマンドを実行します。

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

次の各フィールドを指定して、instances.insert メソッドに対する POST リクエストを発行することで、前の手順で作成した 2 つの VPC ネットワーク サブネットを使用する VM を作成します。

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

次のように置き換えます。

  • PROJECT_ID: コントロール プレーン VPC ネットワークとデータプレーン VPC ネットワークが配置されているプロジェクトのプロジェクト ID。

  • ZONE: VM を作成するゾーン。

  • VM_NAME: VM の名前。

  • MACHINE_TYPE: VM のマシンタイプ(事前定義またはカスタム)。

  • IMAGE_PROJECT: ディスク イメージを含むイメージ プロジェクトの名前。

  • IMAGE_FAMILY: ブートディスクの初期化に使用されるオペレーティング システムのイメージ ファミリー。また、特定のバージョンのイメージを指定することもできます。Compute Engine イメージ プロジェクトのイメージのリストを表示する方法をご覧ください。

  • CONTROL_PLANE_NETWORK_NAME: 前の手順で作成したコントロール プレーン ネットワークの名前。

  • REGION: コントロール プレーンとデータプレーンのネットワークのサブネットが存在するリージョン。

  • CONTROL_PLANE_SUBNET_NAME: 前の手順で作成したコントロール プレーン ネットワークのサブネットの名前。

  • VNIC_TYPE: コントロール プレーンとデータプレーン ネットワークに使用する vNIC タイプ。値は次のいずれかにする必要があります。

    • gVNIC を使用するには、GVNIC を指定します。

    • VirtIO-Net を使用するには、VIRTIO_NET を指定します。

  • DATA_PLANE_NETWORK_NAME: 前の手順で作成したデータプレーン ネットワークの名前。

  • DATA_PLANE_SUBNET_NAME: 前の手順で作成したコントロール プレーン ネットワークのサブネットの名前。

たとえば、us-central1-a ゾーンに dpdk-vm という名前の VM を作成するとします。この VM で、512 GB の SSD 永続ディスク、60 個の vCPU を使用し、Tier_1 ネットワーキング、データプレーンとコントロール プレーン(どちらも gVNIC を使用)のネットワークを備えた事前定義の C2 マシンタイプを指定する場合は、次の 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"
  }
}

VM 作成時のその他の構成オプションについては、VM インスタンスの作成と開始をご覧ください。

VM に DPDK をインストールする

VM に DPDK をインストールするには、次の手順に沿って操作します。

  1. SSH を使用して、前のセクションで作成した VM に接続します。

  2. 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. DPDK をインストールします。

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. サンプルを使用して DPDK をビルドするには:

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

ドライバをインストールする

ドライバで実行するように DPDK を準備するには、次のいずれかの方法を選択してドライバをインストールします。

IOMMU-less VFIO をインストールする

IOMMU-less VFIO ドライバのインストール手順は次のとおりです。

  1. VFIO が有効になっているかどうかを確認します。

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

    VFIO が有効になっていない場合は、UIO をインストールするの手順を実施します。

  2. VFIO で No-IOMMU モードを有効にします。

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

UIO をインストールする

DPDK に UIO ドライバをインストールするには、次のいずれかの方法を選択します。

git を使用して UIO をインストールする

git を使用して DPDK に UIO ドライバをインストールするには、次の手順を実施します。

  1. VM 内のディスクに igb_uio Git リポジトリのクローンを作成します。

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. クローンの Git リポジトリの親ディレクトリからモジュールをビルドし、DPDK に UIO ドライバをインストールします。

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

Linux パッケージを使用して UIO をインストールする

Linux パッケージを使用して DPDK に UIO ドライバをインストールするには、次の手順を実施します。

  1. dpdk-igb-uio-dkms パッケージをインストールします。

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. DPDK に UIO ドライバをインストールします。

    sudo modprobe igb_uio
    

DPDK をドライバにバインドしてテストする

前のセクションでインストールしたドライバに DPDK をバインドするには、次の手順を実施します。

  1. 現在のネットワーク インターフェースの Peripheral Component Interconnect(PCI)スロット番号を取得します。

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

    たとえば、VM がネットワーク インターフェースとして ens4 を使用している場合、PCI スロット番号は 00:04.0 です。

  2. ネットワーク アダプタに接続されているネットワーク インターフェースを停止します。

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    NETWORK_INTERFACE_NAME の部分は、VPC ネットワークで指定されているネットワーク インターフェースの名前に置き換えます。VM が使用しているネットワーク インターフェースを確認するには、次のコマンドを実行してネットワーク インターフェースの構成を表示します。

    sudo ifconfig
    
  3. DPDK をドライバにバインドします。

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

    次のように置き換えます。

    • DRIVER: DPDK をバインドするドライバ。次のいずれかの値を指定します。

      • UIO ドライバ: igb_uio

      • IOMMU-less VFIO ドライバ: vfio-pci

    • PCI_SLOT_NUMBER: 現在のネットワーク インターフェースの PCI スロット番号(00:0NUMBER.0 形式)。

  4. /mnt/huge ディレクトリを作成し、DPDK がバッファに使用する HugePage を作成します。

    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. DPDK ライブラリに付属の testpmd サンプル アプリケーションを実行して、前の手順で作成したネットワーク インターフェースを DPDK が使用できるかどうかをテストします。

    sudo ./build/app/dpdk-testpmd
    

    DPDK のテストの詳細については、Testpmd コマンドライン オプションをご覧ください。

DPDK のバインド解除

DPDK の使用後は、前のセクションでインストールしたドライバから DPDK をバインド解除できます。DPDK をバインド解除する手順は次のとおりです。

  1. 次のコマンドを実行して、ドライバから DPDK をバインド解除します。

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    PCI_SLOT_NUMBER の部分は、前の手順で指定した PCI スロット番号に置き換えます。現在のネットワーク インターフェースの PCI スロット番号を確認する場合は、次のコマンドを実行します。

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

    たとえば、VM がネットワーク インターフェースとして ens4 を使用している場合、PCI スロット番号は 00:04.0 です。

  2. Compute Engine ネットワーク ドライバを再読み込みします。

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

    次のように置き換えます。

    • PCI_SLOT_NUMBER: 前の手順で指定した PCI スロット番号。

    • VNIC_DIRECTORY: vNIC のディレクトリ。使用している vNIC のタイプに応じて、次のいずれかの値を指定します。

      • gVNIC: gvnic

      • VirtIO-Net: virtio-pci

    • NETWORK_INTERFACE_NAME: 前のセクションで指定したネットワーク インターフェースの名前。

次のステップ