tencent cloud

Cloud Virtual Machine

最新情報とお知らせ
製品情報
パブリックイメージの更新情報
OSの公式サポート終了計画
製品に関するお知らせ
製品概要
CVM概要
製品の強み
基本概念
リージョンとゾーン
初心者ガイド
Service Regions and Service Providers
製品の課金
課金概要
課金モデル
課金項目
課金モデルの変更
購入インスタンス
仕様変更の料金説明
料金未払いに関する説明
クイックスタート
カスタム設定によるLinuxインスタンスの購入
カスタム設定によるWindowsインスタンスの購入
ユーザーガイド
操作ガイド一覧
ご利用制限一覧
インスタンス
スポットインスタンス
リザーブドインスタンス
イメージ
ストレージ
バックアップと復元
ネットワーク
セキュリティ
パスワード/キー
監視とアラート
運用管理
便利な機能
サーバー移行
オンライン移行
オフライン移行
移行に関するご相談
トラブルシューティング
CVMインスタンスにログインできない原因や対処法
Windowsインスタンスのログインに関する障害
Linuxインスタンスのログインに関する障害
その他のインスタンスログインに関する障害
インスタンス実行時の障害
Linuxインスタンスのメモリに関する障害
ネットワーク障害
実践チュートリアル
CVMの選定ガイド
環境構築
ウェブサイトの構築
アプリケーションの構築
可視化ページの構築
ローカルファイルをCVMへアップロード
ネットワークパフォーマンステスト
その他の実践チュートリアル
API リファレンス
History
Introduction
API Category
Making API Requests
Region APIs
Instance APIs
Cloud Hosting Cluster APIs
Image APIs
Instance Launch Template APIs
Placement Group APIs
Key APIs
Security Group APIs
Network APIs
Data Types
Error Codes
セキュリティとコンプライアンス
Cloud Access Management(CAM)
ネットワーク
よくあるご質問
リージョンとアベイラビリティゾーンに関するご質問
課金クラス
インスタンスに関するご質問
ストレージに関するご質問
イメージに関するご質問
サーバー移行について
ネットワークに関するご質問
セキュリティに関するご質問
OSに関するご質問
運用と監視に関するご質問
CAMに関するご質問
NTPサービスに関するご質問
適用シナリオに関するご質問
Agreements
CVM Service Level Agreements
Red Hat Enterprise Linux Image Service Agreement
Public IP Service Level Agreement
用語集

DPDKを使用したテスト

PDF
フォーカスモード
フォントサイズ
最終更新日: 2023-06-30 15:28:14

概要

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

操作手順

DPDKのコンパイルとインストール

1. 2つのテストサーバーが必要です。サーバーは Linux CVM 構成のカスタマイズ の指示に従って購入できます。ここではテストサーバーにCentOS 8.2 OSを使用します。
2. 順にテストサーバーにログインし、以下のコマンドを実行してDPDKツールをダウンロードします。CVMへのログイン方法については、 標準ログイン方式を使用してLinuxインスタンスにログイン(推奨)をご参照ください。。
yum install -y sysstat wget tar automake make gcc
wget http://git.dpdk.org/dpdk/snapshot/dpdk-17.11.tar.gz
tar -xf dpdk-17.11.tar.gz
mv dpdk-17.11 dpdk
3. txonlyエンジンを変更し、各DPDKのパケット送信CPUのUDPトラフィック用ポートを、複数のストリームを発生させるよう変更します。
以下のコマンドを実行し、 dpdk/app/test-pmd/txonly.c ファイルを変更します。
vim dpdk/app/test-pmd/txonly.c
i を押して編集モードに入り、以下の内容を変更します。
3.1.1 `#include "testpmd.h"を見つけます。 次の内容を次の行に追加します。
RTE_DEFINE_PER_LCORE(struct udp_hdr, lcore_udp_hdr);
RTE_DEFINE_PER_LCORE(uint16_t, test_port);
結果は次のようになります:


3.1.2 ol_flags |= PKT_TX_MACSEC;を見つけます。 次の内容を次の行に追加します。
/* dummy test udp port */
memcpy(&RTE_PER_LCORE(lcore_udp_hdr), &pkt_udp_hdr, sizeof(pkt_udp_hdr));
3.1.3 for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {を見つけ、これを以下の内容に置き換えます。
RTE_PER_LCORE(test_port)++;
RTE_PER_LCORE(lcore_udp_hdr).src_port = rte_cpu_to_be_16(2222);
RTE_PER_LCORE(lcore_udp_hdr).dst_port = rte_cpu_to_be_16(rte_lcore_id() * 2000 + RTE_PER_LCORE(test_port) % 64);
結果は次のようになります:

3.1.4 copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt,を見つけ、これを以下の内容に置き換えます。
copy_buf_to_pkt(&RTE_PER_LCORE(lcore_udp_hdr), sizeof(RTE_PER_LCORE(lcore_udp_hdr)), pkt,
結果は次のようになります:


Esc を押し、:wq を入力して変更を保存し、終了します。
以下のコマンドを実行し、 dpdk/config/common_base ファイルを変更します。
vim dpdk/config/common_base
i を押して編集モードに入り、CONFIG_RTE_MAX_MEMSEG=256を見つけて、これを1024に変更します。変更が完了すると、以下のようになります。


i を押して編集モードに入り、 CONFIG_RTE_MAX_LCORE=128`を見つけて、システムのCPU コアの数が128より大きい場合は、256に変更できます。変更が完了すると、以下のようになります。


Esc を押し、:wq を入力して変更を保存し、終了します。
説明:
受信側および送信側テストサーバーの両方で上記の構成ファイルを変更する必要があります。以下のコマンドを使用すると、変更されたファイルを相手側に送信し、変更の重複を避けることができます。
scp -P 22 /root/dpdk/app/test-pmd/txonly.c root@<IPアドレス>:/root/dpdk/app/test-pmd/
scp -P 22 /root/dpdk/config/common_base root@<IPアドレス>:/root/dpdk/config
4. 以下のコマンドを実行し、 dpdk/app/test-pmd/txonly.c のIPアドレスを、テストサーバーのIPに変更します。
vim dpdk/app/test-pmd/txonly.c
i を押して編集モードに入り、以下の内容を見つけます。
#define IP_SRC_ADDR (198U << 24) | (18 << 16) | (0 << 8) | 1;
#define IP_DST_ADDR (198U << 24) | (18 << 16) | (0 << 8) | 2;
数字の198、18、0、1をサーバーのIPに置き換えます。SRC_ADDRは送信側の IP、DST_ADDRは受信側のIPとします。
5. サーバーのOSに応じて以下のコマンドを実行し、numaライブラリをインストールします。
CentOS
Ubuntu
yum install numactl-devel
apt-get install libnuma-dev
6. dpdk/ ディレクトリで以下のコマンドを実行し、KNIを無効化します。
sed -i "s/\\(^CONFIG_.*KNI.*\\)=y/\\1=n/g" ./config/*
7. OS が新しいカーネルバージョン (5.3 など) を使用している場合は、次のコマンドを実行して差異をシールドしてください。
sed -i "s/\\(^WERROR_FLAGS += -Wundef -Wwrite-strings$\\)/\\1 -Wno-address-of-packed-member/g" ./mk/toolchain/gcc/rte.vars.mk
sed -i "s/fall back/falls through -/g" ./lib/librte_eal/linuxapp/igb_uio/igb_uio.c
8. 以下のコマンドを実行し、DPDKをコンパイルします。
make defconfig
make -j

ラージページメモリの構成

以下のコマンドを実行し、ラージページメモリを構成します。
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
エラー情報が表示された場合は、ラージページメモリが不足していることを表します。次の例のように、コマンド構成の調整が可能です。
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

カーネルモジュールのロードおよびインターフェースのバインド

説明:
この手順ではPythonを使用する必要があります。 Python公式サイト にアクセスして、適切なバージョンをダウンロードしてインストールします。ここではPython 3.6.8を例とします。
1. VNCを使用してLinuxインスタンスにログイン します。ENIドライバーが igb_uio ユーザー モードドライバーにバインドされた後は、SSH キーまたは IP アドレスではなく、VNC またはコンソール経由でのみ ENI にアクセスできます。
2. 次のコマンドを順に実行し、UIOモジュールをロードし、virtioインターフェイスをバインドします。
ifconfig eth0 0
ifconfig eth0 down
modprobe uio
insmod /root/dpdk/build/kmod/igb_uio.ko
cd /root/dpdk/usertools/
python3 dpdk-devbind.py --bind=igb_uio 00:05.0
説明:
コマンドの中の00.05.0はサンプルアドレスです。以下のコマンドを実行し、ENIの実際のアドレスを取得してください。
python3 dpdk-devbind.py -s
テストが完了したら、次のコマンドを実行してENIを復元します。
cd /root/dpdk/usertools/
python3 dpdk-devbind.py --bind=virtio-pci 00:05.0
ifconfig eth0 up

帯域幅とスループットのテスト

説明:
テストコマンドはtxpktsパラメータを使用してパケットのサイズを制御します。テスト帯域幅は1430B、テストppsは64Bをそれぞれ使用します。
この手順で提供されるコマンドパラメータは CentOS 8.2に適用されます。その他のシステムイメージバージョンを使用する場合は、実際のシーンに応じてパラメータを調整した後、再度テストを行う必要があります。例えば、CentOS 7.4のカーネルバージョンが3.10の場合、CentOS 8.2 のカーネルバージョン4.18との間に性能差が存在するため、帯域幅テストコマンドの中の nb-cores を2に変更することができます。コマンドのパラメータに関するその他の情報については、 testpmd-command-line-options をご参照ください。
1. 次のコマンドを実行して、送信側で testpmdをtxonlyモードで起動し、受信側でrxonlyモードを有効にします。
送信側:
/root/dpdk/build/app/testpmd -l 8-191 -w 0000:00:05.0 -- --burst=128 --nb-cores=32 --txd=512 --rxd=512 --txq=16 --rxq=16 --forward-mode=txonly --txpkts=1430 --stats-period=1
説明:
このうち -l 8-191 -w 0000:00:05.0 これら 2 つのパラメータはテスト環境の実際の値に置き換える必要があります。
受信側:
/root/dpdk/build/app/testpmd -l 8-191 -w 0000:00:05.0 -- --burst=128 --nb-cores=32 --txd=512 --rxd=512 --txq=16 --rxq=16 --forward-mode=rxonly --stats-period=1
2. 次のコマンドを実行し、ppsをテストします(UDP 64B パケット)。
送信側:
/root/dpdk/build/app/testpmd -l 8-191 -w 0000:00:05.0 -- --burst=128 --nb-cores=32 --txd=512 --rxd=512 --txq=16 --rxq=16 --forward-mode=txonly --txpkts=64 --stats-period=1
受信側:
/root/dpdk/build/app/testpmd -l 8-191 -w 0000:00:05.0 -- --burst=128 --nb-cores=32 --txd=512 --rxd=512 --txq=16 --rxq=16 --forward-mode=rxonly --stats-period=1
テスト結果は以下のとおりです:



ネットワーク帯域幅の計算

受信側のPPSとテストパケットの長さに基づいて、現在のネットワークの受信帯域幅を計算することができます。公式は次のとおりです。 PPS × packet length × 8bit/B × 10-9 = 帯域幅 テストで得られたデータと合わせて、得られた現在の帯域幅は次のとおりです。 4692725pps × 1430B × 8bit/B × 10-9 ≈ 53Gbps
説明:
パケット長は1430Bで、14Bイーサネットヘッダー、8B CRC、20B IPヘッダーが含まれます。
テスト結果のRx-ppsは瞬間統計値であり、複数回のテストによって平均値を求めることで、より正確な結果を得ることができます。


ヘルプとサポート

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

フィードバック