tencent cloud

Cloud Virtual Machine

DPDKを使用したテスト

Download
フォーカスモード
フォントサイズ
最終更新日: 2026-08-07 10:12:42
AI翻訳

概要

このドキュメントでは、DPDK を使用してCVM インスタンスの高スループットネットワークパフォーマンスをテストする方法について説明します。

操作手順

ステップ1:環境の準備とインストール

本章では、DPDK テスト環境の構築を完了する手順を説明します。具体的には、ソースコードのダウンロード、解凍、依存ライブラリのインストール、およびコンパイルが含まれます。

環境の準備

CVMにはパブリックネットワークアクセス機能が必要です。CVM作成時にパブリックIPアドレスの割り当てを選択するか、CVM作成後にEIPを設定することができます。
CVMに複数のネットワークカードが設定されている場合、eth0をテストに利用し、残りのネットワークカードでリモートログインを行うことをお勧めします。
関連する操作はシステムのroot権限下で行う必要があります。事前に関連する権限を申請してください。
以下の操作ガイドは、TencentOS 3.0以降のOSに適用されます。
テスト用のサーバーを2台準備し、それぞれ受信側と送信側として設定します。
インスタンスの作成方法については、購入ページでインスタンスを作成をご参照ください。
インスタンスのログイン方法については、OrcaTerm方式を使用してLinuxインスタンスに接続(推奨)をご参照ください。

DPDKソースコードパッケージのダウンロードと解凍

wget コマンドを使用して、公式リポジトリからDPDK 23.11のソースコード圧縮ファイルをダウンロードし、解凍します。
説明:
以降の操作は、DPDKを解凍した後のディレクトリ内で行ってください。
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.gz
tar -xf dpdk-23.11.tar.gz
cd dpdk-23.11

依存ライブラリのインストールとコンパイル

必要な依存ライブラリとコンパイルツールをインストールします。
numactl-devel 依存ライブラリをインストールします(root権限が必要です)。
yum install numactl-devel -y
Pythonビルドツールをインストールします。
pip3 install meson ninja pyelftools
mesonを使用してプロジェクトをビルドします(最大論理コア数を1024に設定します)。
meson build -Dmax_lcores=1024
ninjaを使用してプロジェクトをコンパイルします。
ninja -C build
注意:
テストで使用しているサーバーが標準型SA4以降のインスタンスタイプで、かつCPUが最高スペックである場合は、特殊シナリオの処理を参照して、関連する設定手順を追加してください。

ステップ2:カーネルドライバモジュールのバインド

DPDKは、専用のカーネルドライバモジュールをバインドしてネットワークカードデバイスを引き継ぐ必要があります。

UIOモジュールのダウンロード

DPDK公式リポジトリからカーネルモジュールのコードをクローンします:
git clone http://dpdk.org/git/dpdk-kmods
またはgitプロトコル(代替案)を利用します。
git clone git://dpdk.org/dpdk-kmods

UIOモジュールのコンパイル

igb_uioディレクトリに移動してコンパイルします。
cd ./dpdk-kmods/linux/igb_uio
make

UIOモジュールの読み込み

uioおよびigb_uioカーネルモジュールを読み込みます(root権限が必要です)。
modprobe uio
insmod ./dpdk-kmods/linux/igb_uio/igb_uio.ko

ネットワークカードのPCIアドレスの照会と記録

ネットワークカードをバインドする前に、対象のネットワークカードのPCIアドレスを取得して記録する必要があります。以下のコマンドを実行して、すべてのネットワークカードデバイスの情報を確認し、記録します:
ethtool -i eth0 | grep bus-info


ネットワークカードのUIOドライバへのバインド

DPDKが提供するツールを使用して、ネットワークカードをigb_uioドライバにバインドします。
1. ネットワークカードを無効にします。
注意:
ネットワークカードを無効にする前に、現在他のENIのIPを利用してCVMにリモートログインしているかどうかを確認してください。eth0を利用してリモートログインしている場合、接続が切断されます。
ifconfig eth0 down
2. ネットワークカードをigb_uioドライバにバインドします(実際のPCIアドレスに置き換えてください)。
./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:01.0 #0000:02:01.0は、実際のネットワークカードのPCIアドレスに置き換えてください。

ステップ3:大容量ページメモリの設定

DPDKは、メモリアクセス効率を向上させるために、大容量ページ(Huge Pages)を利用します。大容量ページの設定は、DPDKを実行するための必要条件です。
以下のコマンドを実行して、大容量ページメモリを割り当てます(ここでは2MBの大容量ページを例とし、8192ページ、合計約16GBを割り当てます):
echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

ステップ4:パフォーマンステストの実行

DPDKパフォーマンステストは、RX-TXデュアルサーバーモードを採用します:一台のサーバーが受信側(RX)として、もう一台のサーバーが送信側(TX)として機能します。
説明:
RXは受信側、TXは送信側です。2台のサーバーはそれぞれ対応するコマンドを実行する必要があります。
RX受信側のコマンドは以下の通りです:
C=4; Q=32; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=rxonly --stats-period=1
TX送信側のコマンドは以下の通りです:
C=4; Q=32; S=10.31.0.80; D=10.31.0.240; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --tx-ip $S,$D --txonly-multi-flow --txpkts=64 --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=txonly --stats-period=1

パラメータの詳細説明

パラメータ
説明
-a 0000:1b:00.0
使用するネットワークカードのPCIアドレスを指定し、実際の環境に応じて置き換える必要があります。
--tx-ip S,D
TX側で送信するパケットの宛先IPアドレスは、CVMのネットワークカードアドレスに従って置き換えます。
--txonly-multi-flow
マルチフロー送信モードを有効にします(設定しない場合は単一フローのみを送信します)。
--txpkts=64
パケット長(バイト、MACヘッダーを含む)です。PPSテストシナリオでは64を推奨します。
-l 0-47
使用するCPUコア番号の範囲を指定し、必要に応じて変更します。NUMAをまたぐシナリオでは、キューのNUMA間分布を参照して取得できます。
--txq / --rxq = $Q
送信/受信キューの数量は、ethtool -l eth0 | grep Combinedで確認できます。
--nb-cores=$C
実際にテストに参加するCPUコア数です。2 ≤ C ≤ Qを推奨します。
--stats-period=1
統計情報を1秒ごとに1回出力します。
テスト結果の例は以下の通りです。左側がRX受信側、右側がTX送信側です:


ステップ5:テスト環境の復元

テスト完了後、環境を初期状態に復元し、リソースを解放して、他のサービスへの影響を避けることをお勧めします。

ネットワークカードドライバの復元

dpdk-devbind.pyツールを使用して、ネットワークカードをデフォルトドライバに復元します:
./usertools/dpdk-devbind.py -b virtio-pci 0000:00:08.0 # 注意:0000:00:08.0は、実際のPCIアドレスに置き換えてください。
上記のコマンドが正常に動作しない場合は、以下のコマンドを手動で実行して、vfio-pciのバインドを解除できます。
echo 0000:1b:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind #0000:1b:00.0は必要に応じて置き換えてください。
echo virtio-pci > /sys/bus/pci/devices/0000\\:1b\\:00.0/driver_override #driver_overrideをvirtio-pciに設定します。
echo 0000:1b:00.0 > /sys/bus/pci/drivers/virtio-pci/bind #virtio-pciに再バインドします。

大容量ページメモリの復元

ヒュージページメモリの数量をゼロにします。
echo 0 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
ネットワークカードを再度有効にします。
ifconfig eth1 up

特殊シナリオの処理

テストで使用しているサーバーが標準型SA4以降のインスタンスタイプで、かつCPUが最高スペックである場合は、以下の設定手順を追加する必要があります。

キューNUMA間分布の確認

説明:
マルチCPUのサーバーでは、DPDKが使用するCPUコアとネットワークカードが同じNUMAノード上にあることを確認する必要があります。そうしないと、パフォーマンスが大幅に低下します。
1. スクリプトをダウンロードして確認します。
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/dpdk_core_advisor.sh
2. クロスキューNUMA分布スクリプトを実行して確認します。
sh dpdk_core_advisor.sh eth0
返された結果がキューがNUMAにまたがって分布していることを示している場合は、lag_dpdk.patchをインストールしてください。

lag_dpdk.patchのインストール

1. lag_dpdk.patch パッチスクリプトをダウンロードします。
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/lag_dpdk.patch
2. パッチを適用します。
git apply lag_dpdk.patch
# 同等のコマンド(いずれか一つを選択してください)
patch -p1 < lag_dpdk.patch
3. 再コンパイルします。
meson build -Dmax_lcores=1024
ninja -C build



ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック