このドキュメントでは、仮想マシン(VM)インスタンスでデータプレーン開発キット(DPDK)を有効にして、ネットワーク パケット処理を高速化する方法について説明します。
DPDK は、高速パケット処理、低レイテンシ、一貫性のあるパフォーマンスを必要とするパフォーマンス重視のアプリケーションに対応したフレームワークです。DPDK は、カーネル ネットワークをバイパスし、ユーザー空間で直接実行するデータプレーン ライブラリとネットワーク インターフェース コントローラ(NIC)のセットを提供します。たとえば、VM で DPDK を有効にすると、次のものを実行する際に便利です。
ネットワーク機能の仮想化(NFV)のデプロイ
ソフトウェア定義ネットワーキング(SDN)アプリケーション
動画ストリーミングや Voice over IP アプリケーション
VM では、次のいずれかの仮想 NIC(vNIC)タイプを使用して DPDK を実行できます。
推奨: gVNIC
virtIO の後継となる次世代の vNIC として、Compute Engine に特化して設計された、高パフォーマンス、安全、スケーラブルな仮想ネットワーク インターフェース。
-
ブロック ストレージやネットワーク アダプタなどの物理ハードウェアに VM が効率的にアクセスできるようにするオープンソースのイーサネット ドライバ。
DPDK を物理ハードウェアではなく仮想環境で実行する場合の問題のひとつとして、仮想環境では高パフォーマンスのアプリケーションに対して SR-IOV と I/O メモリ管理ユニット(IOMMU)がサポートされていないことが挙げられます。この制限を回避するには、次のいずれかのドライバを使用して、ホスト仮想アドレスではなくゲスト物理アドレスで DPDK を実行する必要があります。
IOMMU-less 仮想関数 I/O(VFIO)
準備
-
まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。
このページのサンプルをどのように使うかに応じて、タブを選択してください。
コンソール
Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- デフォルトのリージョンとゾーンを設定します。
REST
このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。
Install the Google Cloud CLI, then initialize it by running the following command:
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 を実行する際は、次の制限があります。
VM で使用されている 2 つの VPC ネットワークに対しては、シングル スタック サブネットのみを使用できます。
2 つの VPC ネットワークの vNIC タイプとして gVNIC を使用する場合は、次の点を確認してください。
DPDK バージョン 22.11 以降を使用する必要があります。
サポートされているディスク イメージのみを使用できます。
ネットワーク パフォーマンスを高めるために、VM の作成時に VM ごとの Tier_1 ネットワーキング パフォーマンスを有効にするには、次の項目を指定する必要があります。
vNIC タイプとしての gVNIC
30 以上の vCPU を備えたサポートされているマシンタイプ
DPDK を実行するように VM を構成する
このセクションでは、DPDK を実行する VM を作成する方法について説明します。
VPC ネットワークを作成する
Google Cloud コンソール、Google Cloud CLI、Compute Engine API のいずれかを使用して、データプレーンとコントロール プレーンの 2 つの VPC ネットワークを作成します。これらのネットワークは、後で VM を作成するときに指定できます。
コンソール
データプレーン用の VPC ネットワークを作成します。
Google Cloud コンソールで、[VPC ネットワーク] に移動します。
[VPC ネットワーク] ページが開きます。
[
VPC ネットワークを作成] をクリックします。[VPC ネットワークの作成] ページが開きます。
[名前] フィールドに、ネットワークの名前を入力します。
[新しいサブネット] セクションで、次の操作を行います。
[名前] フィールドに、サブネットの名前を入力します。
[リージョン] メニューで、サブネットのリージョンを選択します。
[IPv4(シングルスタック)](デフォルト)を選択します。
[IPv4 範囲] に、CIDR 表記の有効な IPv4 範囲のアドレスを入力します。
[完了] をクリックします。
[作成] をクリックします。
[VPC ネットワーク] ページが開きます。VPC ネットワークの作成が完了するまでに 1 分ほどかかることがあります。
VM への SSH 接続を許可するファイアウォール ルールを設定して、コントロール プレーン用の VPC ネットワークを作成します。
もう一度 [
VPC ネットワークを作成] をクリックします。[VPC ネットワークの作成] ページが開きます。
[名前] フィールドに、ネットワークの名前を入力します。
[新しいサブネット] セクションで、次の操作を行います。
[名前] フィールドに、サブネットの名前を入力します。
[リージョン] メニューで、データプレーン ネットワークのサブネットに指定したものと同じリージョンを選択します。
[IPv4(シングルスタック)](デフォルト)を選択します。
[IPv4 範囲] に、CIDR 表記の有効な IPv4 範囲のアドレスを入力します。
[完了] をクリックします。
[IPv4 ファイアウォール ルール] タブで、[NETWORK_NAME-allow-ssh] チェックボックスをオンにします。
NETWORK_NAME は、前の手順で指定したネットワーク名です。
[作成] をクリックします。
[VPC ネットワーク] ページが開きます。VPC ネットワークの作成が完了するまでに 1 分ほどかかることがあります。
gcloud
データプレーン用の VPC ネットワークを作成する手順は次のとおりです。
--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)。値は1300
~8896
の範囲で指定する必要があります。デフォルト値は1460
です。MTU を1460
より大きい値に設定する前に、最大伝送単位を確認してください。
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
: サブネットを作成するリージョン。
VM への SSH 接続を許可するファイアウォール ルールを持つコントロール プレーン用の VPC ネットワークを作成するには、次の操作を行います。
--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。値は1300
~8896
の範囲で指定する必要があります。デフォルト値は1460
です。MTU を1460
より大きい値に設定する前に、最大伝送単位を確認してください。
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
: サブネットを作成するリージョン。データプレーン ネットワークのサブネットで指定したリージョンと一致している必要があります。
--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
データプレーン用の VPC ネットワークを作成する手順は次のとおりです。
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)。値は1300
~8896
の範囲で指定する必要があります。デフォルト値は1460
です。MTU を1460
より大きい値に設定する前に、最大伝送単位を確認してください。
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
: 前の手順で作成したデータプレーン ネットワークの名前。
VM への SSH 接続を許可するファイアウォール ルールを持つコントロール プレーン用の VPC ネットワークを作成するには、次の操作を行います。
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。値は1300
~8896
の範囲で指定する必要があります。デフォルト値は1460
です。MTU を1460
より大きい値に設定する前に、最大伝送単位を確認してください。
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
: 前の手順で作成したコントロール プレーン ネットワークの名前。
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 を作成します。
Google Cloud コンソールで、[VM インスタンス] に移動します。
[VM インスタンス] ページが開きます。
[
インスタンスを作成] をクリックします。[インスタンスの作成] ページが開きます。
[名前] フィールドに、VM の名前を入力します。
[リージョン] メニューで、前の手順でネットワークを作成したリージョンと同じリージョンを選択します。
[ゾーン] メニューで、VM のゾーンを選択します。
[マシンの構成] セクションで、次の操作を行います。
次のオプションのいずれかを選択します。
一般的なワークロードの場合は、[汎用] タブを選択します(デフォルト)。
高いパフォーマンスが要求されるワークロードの場合は、[コンピューティング最適化] タブを選択します。
メモリ対 vCPU 比が高いワークロードの場合は、[メモリ最適化] タブを選択します。
画像処理装置(GPU)を使用するワークロードの場合は、[GPU] タブを選択します。
(省略可)前の手順で GPU を指定し、VM にアタッチする GPU を変更する場合は、次のいずれかまたは両方を行います。
[GPU のタイプ] メニューで、GPU のタイプを選択します。
[GPU の数] メニューで、GPU の数を選択します。
[シリーズ] メニューで、マシンシリーズを選択します。
[マシンタイプ] メニューでマシンタイプを選択します。
省略可: [高度な構成] を開き、画面の指示に沿って、この VM のマシンをさらにカスタマイズします。
省略可: [ブートディスク] セクションで [変更] をクリックし、画面の指示に沿ってディスク イメージを変更します。
[詳細オプション] セクションを開きます。
[ネットワーキング] セクションを開きます。
[ネットワーク パフォーマンスの構成] セクションで、次の操作を行います。
[ネットワーク インターフェース カード] メニューで、次のいずれかを選択します。
gVNIC を使用するには、[gVNIC] を選択します。
VirtIO-Net を使用するには、[VirtIO] を選択します。
省略可: ネットワーク パフォーマンスを向上させ、レイテンシを短縮するには、[VM ごとの Tier_1 ネットワーキング パフォーマンスを有効にする] チェックボックスをオンにします。
[ネットワーク インターフェース] セクションで、次の操作を行います。
default 行で、[
「default」を削除します] をクリックします。[ネットワーク インターフェースを追加] をクリックします。
[新しいネットワーク インターフェース] セクションが表示されます。
[ネットワーク] メニューで、前の手順で作成したコントロール プレーン ネットワークを選択します。
[完了] をクリックします。
もう一度 [ネットワーク インターフェースを追加] をクリックします。
[新しいネットワーク インターフェース] セクションが表示されます。
[ネットワーク] メニューで、前の手順で作成したデータプレーン ネットワークを選択します。
[完了] をクリックします。
[作成] をクリックします。
[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
: ディスク イメージを含むイメージ プロジェクトの名前。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 の名前。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 をインストールするには、次の手順に沿って操作します。
SSH を使用して、前のセクションで作成した VM に接続します。
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
DPDK をインストールします。
wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz tar xvf dpdk-23.07.tar.xz cd dpdk-23.07
サンプルを使用して DPDK をビルドするには:
meson setup -Dexamples=all build sudo ninja -C build install; sudo ldconfig
ドライバをインストールする
ドライバで実行するように DPDK を準備するには、次のいずれかの方法を選択してドライバをインストールします。
IOMMU-less VFIO をインストールする
IOMMU-less VFIO ドライバのインストール手順は次のとおりです。
VFIO が有効になっているかどうかを確認します。
cat /boot/config-$(uname -r) | grep NOIOMMU
VFIO が有効になっていない場合は、UIO をインストールするの手順を実施します。
VFIO で No-IOMMU モードを有効にします。
sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
UIO をインストールする
DPDK に UIO ドライバをインストールするには、次のいずれかの方法を選択します。
git を使用して UIO をインストールする
git
を使用して DPDK に UIO ドライバをインストールするには、次の手順を実施します。
VM 内のディスクに
igb_uio
Git リポジトリのクローンを作成します。git clone https://dpdk.org/git/dpdk-kmods
クローンの Git リポジトリの親ディレクトリからモジュールをビルドし、DPDK に UIO ドライバをインストールします。
pushd dpdk-kmods/linux/igb_uio sudo make sudo depmod && sudo insmod igb_uio.ko popd
Linux パッケージを使用して UIO をインストールする
Linux パッケージを使用して DPDK に UIO ドライバをインストールするには、次の手順を実施します。
dpdk-igb-uio-dkms
パッケージをインストールします。sudo apt-get install -y dpdk-igb-uio-dkms
DPDK に UIO ドライバをインストールします。
sudo modprobe igb_uio
DPDK をドライバにバインドしてテストする
前のセクションでインストールしたドライバに DPDK をバインドするには、次の手順を実施します。
現在のネットワーク インターフェースの Peripheral Component Interconnect(PCI)スロット番号を取得します。
sudo lspci | grep -e "gVNIC" -e "Virtio network device"
たとえば、VM がネットワーク インターフェースとして
ens4
を使用している場合、PCI スロット番号は00:04.0
です。ネットワーク アダプタに接続されているネットワーク インターフェースを停止します。
sudo ip link set NETWORK_INTERFACE_NAME down
NETWORK_INTERFACE_NAME
の部分は、VPC ネットワークで指定されているネットワーク インターフェースの名前に置き換えます。VM が使用しているネットワーク インターフェースを確認するには、次のコマンドを実行してネットワーク インターフェースの構成を表示します。sudo ifconfig
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
形式)。
/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'
DPDK ライブラリに付属の
testpmd
サンプル アプリケーションを実行して、前の手順で作成したネットワーク インターフェースを DPDK が使用できるかどうかをテストします。sudo ./build/app/dpdk-testpmd
DPDK のテストの詳細については、Testpmd コマンドライン オプションをご覧ください。
DPDK のバインド解除
DPDK の使用後は、前のセクションでインストールしたドライバから DPDK をバインド解除できます。DPDK をバインド解除する手順は次のとおりです。
次のコマンドを実行して、ドライバから 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
です。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
: 前のセクションで指定したネットワーク インターフェースの名前。
次のステップ
マシンタイプのネットワーク帯域幅レートを確認する。
VPC ネットワークの作成と管理の詳細を確認する。
ジャンボ フレームを使用した高 MTU 設定の詳細を確認する。
ネットワーク パフォーマンスを対象とした TCP 最適化の詳細を確認する。