パケット転送レート (PPS)、ネットワーク帯域幅、ネットワークレイテンシーは、ECS インスタンスにおけるネットワークパフォーマンスの重要な指標です。ネットワークパフォーマンスをテストすることで、その安定性、レイテンシー、スループットを評価し、ユーザーエクスペリエンスとアプリケーションパフォーマンスを向上させることができます。このトピックでは、Netperf や sockperf などのツールを使用して、ECS インスタンスのネットワークパフォーマンスをテストする方法について説明します。
-
データ損失を防ぐため、新規の空の ECS インスタンスでネットワークパフォーマンスをテストしてください。
-
インスタンスタイプのメトリクスは、テスト環境で検証済みです。インスタンスの実際のパフォーマンスは、インスタンスの負荷やネットワーキングモデルなどの要因によって異なる場合があります。
テスト環境の準備
要件
-
パケット転送レート (pps)、ネットワーク帯域幅、ネットワーク遅延のテストなど、さまざまなテストシナリオに対応するために、Elastic Compute Service (ECS) インスタンスを準備します。ECS インスタンスの作成方法については、「ECS インスタンスのカスタム起動」をご参照ください。
重要正確で比較可能なテスト結果を確保するために、同じインスタンスタイプのインスタンスを使用してください。これにより、vCPU 数、メモリサイズ、ネットワーク帯域幅の違いがテスト結果に影響するのを防ぐことができます。
-
各テストにおいて、すべての ECS インスタンスは同じ VPC 内にあり、同じ VSwitch を使用し、同じセキュリティグループに属している必要があります。
環境の例
次の表に、テストマシンと補助テストマシンのインスタンスタイプと数量の例を示します。テスト中は、要件に基づいてマシンを選択してください。
-
ECS インスタンスのパケット転送レート (pps) のテスト (Linux のみ)
説明このトピックでは、適切なベンチマークツールが利用できないため、Windows インスタンスでのパケット転送レート (pps) のテスト手順は省略しています。
6,000,000 pps 未満
仕様
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.large
ecs.g7.large
イメージ
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
インスタンス数
1
1
ネットワーク
パブリック IP アドレスが割り当て済み。
6,000,000~20,000,000 pps
仕様
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.16xlarge
ecs.g7.16xlarge
イメージ
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
インスタンス数
1
3
ネットワーク
パブリック IP アドレスが割り当て済み。
20,000,000 pps 超
仕様
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.32xlarge
ecs.g7.32xlarge
イメージ
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
インスタンス数
1
3
ネットワーク
パブリック IP アドレスが割り当て済み。
-
ECS インスタンスのネットワーク帯域幅とネットワーク遅延のテスト
Linux インスタンス
仕様
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.large
ecs.g7.large
イメージ
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
インスタンス数
1
1
ネットワーク
パブリック IP アドレスが割り当て済み。
Windows インスタンス
仕様
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.large
ecs.g7.large
イメージ
Windows Server 2022
Windows Server 2022
インスタンス数
1
1
ネットワーク
パブリック IP アドレスが割り当て済み。
ネットワークパフォーマンスのテスト
ネットワーク PPS のテスト (Linux のみ)
適切なテストツールがすぐに入手できないため、このトピックでは Windows インスタンスでのパケット転送レート (PPS) をテストする手順は記載していません。
6,000,000 PPS 未満
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
-
テストインスタンスと補助テストインスタンスの両方で、次のコマンドを実行して Netperf をダウンロードします。
wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz -
テストインスタンスと補助テストインスタンスの両方で、Netperf と sar 監視ツールをインストールします。
-
次のコマンドを実行して依存関係をインストールし、Netperf パッケージを展開します。
sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz -
次のコマンドを実行して
gccのバージョンを確認します。gcc -v 2>&1 -
テストインスタンスまたは補助テストインスタンスの
gccのバージョンが 10 より新しい場合は、次の手順を実行してgccが正しくコンパイルできるようにします。それ以外の場合は、この手順をスキップします。-
次のコマンドを実行して
nettest_omni.cファイルを編集します。cd netperf vim src/nettest_omni.c -
i を押して挿入モードに入り、
nettest_omni.cファイルから宣言済み変数を手動で削除します。次の変数宣言を削除します:
/* ソケット用のさまざまなオプション */ int loc_nodelay, /* ローカルで NODELAY を使用する/しない */ rem_nodelay, /* リモートで NODELAY を使用する/しない */ loc_sndavoid, /* ローカルで送信コピーを回避する */ loc_rcvavoid, /* ローカルで受信コピーを回避する */ rem_sndavoid, /* リモートで送信コピーを回避する */ rem_rcvavoid; /* リモートで受信コピーを回避する */ -
変更を保存して終了するには、Esc を押し、
:wqを入力してから Enter を押します。
-
-
次のコマンドを実行して Netperf をコンパイルし、インストールします。
cd netperf sudo ./configure sudo make && sudo make install
-
-
テストインスタンスで、次のスクリプトを実行して 64 個の netserver サービスを起動します。
#!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf > /dev/null 2>&1 & done -
テストインスタンスで、次のコマンドを実行してプライベート IP アドレスを確認します。
ifconfig || ip addr
-
補助テストインスタンスで、次のスクリプトを実行してテストインスタンスにトラフィックを送信します。
#!/bin/bash server_ip=<test_instance_private_ip_address> for j in `seq 64`; do port=$[16000+j] netperf -H ${server_ip} -l ${run_time:-300} -t UDP_STREAM -p $port -- -m 1 -D > /dev/null 2>&1 & done<test_instance_private_ip_address>を、前の手順で取得したテストインスタンスのプライベート IP アドレスに置き換えます。
-
テストインスタンスで、次のコマンドを実行してパケット転送レートをテストします。
sar -n DEV 1テスト結果で、
rxpck/s列の値を確認します。rxpck/sの値は、テストインスタンスが 1 秒あたりに受信したパケットの総数を示します。次の図に示す例では、テストインスタンスが 1 秒あたりに受信したパケットの平均数は約 940,000 です。
6,000,000~20,000,000 PPS
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
-
テストインスタンスと 3 台の補助テストインスタンスで、次のコマンドを実行して sockperf をインストールします。
sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install -
テストインスタンスで、次のコマンドを実行してプライベート IP アドレスを確認します。
ifconfig || ip addr
-
3 台の補助テストインスタンスそれぞれで、次のスクリプトを実行してテストインスタンスにトラフィックを送信します。
server_ip="<test_instance_private_ip_address>" threads=64 msg_size=14 run_time=60 basePort=6666 for((i=0;i<$threads;++i));do nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 & doneスクリプト内の
<test_instance_private_ip_address>はテストインスタンスのプライベート IP アドレス、run_timeはテスト時間です。必要に応じて値を変更してください。 -
テストインスタンスと 3 台の補助テストインスタンスで、次のコマンドを実行してパケット転送レートをテストします。
sar -n DEV 1テストインスタンスで、
rxpck/s列の値を確認します。rxpck/sの値は、テストインスタンスが 1 秒あたりに受信したパケット数を示します。たとえば、テストインスタンスは 1 秒あたり約 1,200 万個のパケットを受信しています。
20,000,000 PPS 超
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
-
テストインスタンスと 3 台の補助テストインスタンスで、次のコマンドを実行して sockperf をインストールします。
sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install -
テストインスタンスで、次のスクリプトを実行して割り込み要求 (IRQ) をバインドします。
高 PPS シナリオでは、割り込み要求 (IRQ) を特定の CPU コアにバインドすることで、IRQ の処理をそれらのコアで行えます。これにより、コンテキストスイッチが減り、処理効率が向上します。
a=$(cat /proc/interrupts | grep virtio2-input | awk -F ':' '{print $1}') cpu=0 for irq in $a; do echo $cpu >/proc/irq/$irq/smp_affinity_list let cpu+=2 done -
テストインスタンスで、次のコマンドを実行してプライベート IP アドレスを確認します。
ifconfig || ip addr
-
3 台の補助テストインスタンスそれぞれで、次のスクリプトを実行してテストインスタンスにトラフィックを送信します。
server_ip="<test_instance_private_ip_address>" threads=64 msg_size=14 run_time=60 basePort=6666 for((i=0;i<$threads;++i));do nohup sockperf tp -i $server_ip --pps max -m ${msg_size} -t ${run_time} --port $[${basePort}+${i}] 2>&1 & doneスクリプト内の
<test_instance_private_ip_address>はテストインスタンスのプライベート IP アドレス、run_timeはテスト時間です。必要に応じて値を変更してください。 -
テストインスタンスと 3 台の補助テストインスタンスで、次のコマンドを実行してパケット転送レートをテストします。
sar -n DEV 1テストインスタンスで、
rxpck/s列の値を確認します。rxpck/sの値は、テストインスタンスが 1 秒あたりに受信したパケット数を示します。次の図に示す例では、1 秒あたりに受信するパケット数は約 2,000 万です。
ネットワーク帯域幅のテスト
Linux インスタンス
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
-
テストインスタンスと補助テストインスタンスの両方で、次のコマンドを実行して Netperf をダウンロードします。
wget https://benchmark-packages.oss-cn-qingdao.aliyuncs.com/netperf-2.7.0.tar.gz -
テストインスタンスと補助テストインスタンスの両方で、Netperf と sar 監視ツールをインストールします。
-
次のコマンドを実行して依存関係をインストールし、Netperf パッケージを展開します。
sudo yum install -y gcc autoconf automake libtool sysstat tar -zxvf netperf-2.7.0.tar.gz -
次のコマンドを実行して
gccのバージョンを確認します。gcc -v 2>&1 -
テストインスタンスまたは補助テストインスタンスの
gccのバージョンが 10 より新しい場合は、次の手順を実行してgccが正しくコンパイルできるようにします。それ以外の場合は、この手順をスキップします。-
次のコマンドを実行して
nettest_omni.cファイルを編集します。cd netperf vim src/nettest_omni.c -
i を押して挿入モードに入り、
nettest_omni.cファイルから宣言済み変数を手動で削除します。次の変数宣言を削除します:
/* ソケット用のさまざまなオプション */ int loc_nodelay, /* ローカルで NODELAY を使用する/しない */ rem_nodelay, /* リモートで NODELAY を使用する/しない */ loc_sndavoid, /* ローカルで送信コピーを回避する */ loc_rcvavoid, /* ローカルで受信コピーを回避する */ rem_sndavoid, /* リモートで送信コピーを回避する */ rem_rcvavoid; /* リモートで受信コピーを回避する */ -
変更を保存して終了するには、Esc を押し、
:wqを入力してから Enter を押します。
-
-
次のコマンドを実行して Netperf をコンパイルし、インストールします。
cd netperf sudo ./configure sudo make && sudo make install
-
-
テストインスタンスで、次のスクリプトを実行して 64 個の netserver サービスを起動します。
#!/bin/bash for j in `seq 64`; do netserver -p $[16000+j] > server_$[16000+j].netperf 2>&1 & done -
テストインスタンスで、次のコマンドを実行してプライベート IP アドレスを確認します。
ifconfig || ip addr
-
補助テストインスタンスで、次のスクリプトを実行してテストインスタンスにトラフィックを送信します。
#!/bin/bash server_ip=<test_instance_private_ip_address> for j in `seq 64`; do port=$[16000+j] netperf -H ${server_ip} -l ${run_time:-300} -t TCP_STREAM -p $port -- -D > /dev/null 2>&1 & done<test_instance_private_ip_address>を、前の手順で取得したテストインスタンスのプライベート IP アドレスに置き換えます。
-
テストインスタンスで、次のコマンドを実行してネットワーク帯域幅をテストします。
sar -n DEV 1テスト結果の rxkB/s 列には、KB/s 単位で受信したデータ量が表示されます。Kbps 単位の帯域幅を算出するには、この値に 8 を掛けます (1 バイト = 8 ビットのため)。
例を次の図に示します。

Windows インスタンス
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Windows インスタンスにログインする」をご参照ください。
-
テストインスタンスと補助テストインスタンスの両方で、テストツールをインストールし、ファイアウォールを設定します。
-
ntttcp.exe ツールをダウンロードし、保存パスを控えます。
-
[ファイル名を指定して実行] ダイアログボックスを開き、powershell を入力して Enter を押し、PowerShell を開きます。
-
次のコマンドを実行してファイアウォールを無効化します。これにより、ファイアウォールによって 2 つのインスタンス間の接続がブロックされるのを防ぎます。
Set-NetFirewallProfile -Profile * -Enabled:falseまたは、インバウンドルールを追加して、ntttcp.exe のパケットがファイアウォールを通過できるようにします。
$ntttcpPath = "<path_to_ntttcp_exe>" New-NetFirewallRule -DisplayName ntttcp -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $ntttcpPath説明お使いの環境に合わせて、
<path_to_ntttcp_exe>を ntttcp.exe ファイルの実際のパスに置き換える必要があります。
-
-
テストインスタンスで、次のコマンドを実行してネットワークアダプターの受信側スケーリング (RSS) 機能を設定します。
受信側スケーリング (RSS) は、マルチプロセッサシステムにおいてネットワーク受信処理を複数の CPU コアに効率よく分散するネットワークドライバー技術です。次のコマンドでは、次の処理を実行します:
-
テストインスタンスの CPU コア数が 16 以下の場合、RSS の受信キュー数を CPU コア数と同じに設定します。これにより、各 CPU コアが専用の受信キューを持ち、ネットワークトラフィックを処理できます。
-
テストインスタンスの CPU コア数が 16 を超える場合、RSS 機能を無効化します。これは、多くのネットワークアダプターでは RSS キューの最大数が 16 に制限されるためです。この場合に RSS を継続して使用すると、リソース割り当ての偏りや管理の複雑化につながる可能性があります。
$cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors if ($cpuNum -le 16) { Set-NetAdapterRss -Name <name_of_the_network_adapter> -NumberOfReceiveQueues $cpuNum } else { Disable-NetAdapterRss -Name <name_of_the_network_adapter> }説明-
お使いの環境に合わせて、
<name_of_the_network_adapter>をテストインスタンス上のネットワークアダプター名に置き換える必要があります。Get-NetAdapter | Select-Object Nameコマンドを実行して名前を取得できます。 -
RSS 設定の変更にはアダプターの再起動が必要であり、ネットワーク接続が一時的に中断される場合があります。接続が復旧してから続行してください。
-
-
テストインスタンスで、次のコマンドを実行してデータ受信の準備を行います。
$serverIp = (Get-NetIPConfiguration -InterfaceAlias <name_of_the_network_adapter>).IPv4Address.IPAddress $cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors $threadNum = $cpuNum & <path_to_ntttcp_exe_on_test_instance> -r -m $threadNum,0,$serverIp -t 300説明お使いの環境に合わせて、
<name_of_the_network_adapter>と<path_to_ntttcp_exe_on_test_instance>を置き換える必要があります。 -
補助テストインスタンスで、次のコマンドを実行してデータを送信します。
$serverIp = "<test_instance_private_ip_address>" $threadNum = "<thread_num_of_test_instance>" <path_to_ntttcp_exe_on_auxiliary_instance> -s -m $threadNum,*,$serverIp -t 100説明お使いの環境に合わせて、
<test_instance_private_ip_address>、<thread_num_of_test_instance>、<path_to_ntttcp_exe_on_auxiliary_instance>を置き換える必要があります。ipconfigコマンドを実行してテストインスタンスのプライベート IP アドレスを取得できます。また、$cpuNum変数の値からテストインスタンスのスレッド数を確認できます。 -
テスト結果のネットワーク帯域幅を確認します。
テスト結果の
Throughput(MB/s)の値がネットワーク帯域幅を示します。
ネットワーク遅延のテスト
Linux インスタンス
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
-
テストインスタンスと補助テストインスタンスの両方で、次のコマンドを実行して
sockperfをインストールします。sudo yum install -y autoconf automake libtool gcc-c++ cd /opt sudo wget https://github.com/Mellanox/sockperf/archive/refs/tags/3.8.tar.gz sudo tar -zxf 3.8.tar.gz cd sockperf-3.8/ sudo ./autogen.sh sudo ./configure sudo make -j `cat /proc/cpuinfo| grep process | wc -l` sudo make install -
テストインスタンスで、次のコマンドを実行してプライベート IP アドレスを確認します。
ifconfig || ip addr
-
テストインスタンスで、次のコマンドを実行してサービスを起動します。
sockperf sr --tcp --daemonize -
補助テストインスタンスで、次のコマンドを実行してテストインスタンスにトラフィックを送信します。
sockperf pp -i <test_instance_private_ip_address> --tcp -t 30 -m 14 --full-log=result.json<test_instance_private_ip_address>を、前の手順で取得したテストインスタンスのプライベート IP アドレスに置き換えます。 -
テスト結果のネットワーク遅延を確認します。
テスト結果の例を次の図に示します:
-
avg-latencyで始まる行は、マイクロ秒 (μs) 単位の平均レイテンシーを示します。 -
percentile 99.000で始まる行は、マイクロ秒 (μs) 単位の 99 パーセンタイルレイテンシーを示します。

-
Windows インスタンス
-
テストインスタンスと補助テストインスタンスに接続します。
詳細については、「Workbench を使用して Windows インスタンスにログインする」をご参照ください。
-
テストインスタンスと補助テストインスタンスの両方で、テストツールをインストールし、ファイアウォールを設定します。
-
latte.exe ツールをダウンロードし、保存パスを控えます。
-
[ファイル名を指定して実行] ダイアログボックスを開き、powershell を入力して Enter を押し、PowerShell を開きます。
-
次のコマンドを実行してファイアウォールを無効化します。これにより、ファイアウォールによって 2 つのインスタンス間の接続がブロックされるのを防ぎます。
Set-NetFirewallProfile -Profile * -Enabled:falseまたは、インバウンドルールを追加して、latte.exe のパケットがファイアウォールを通過できるようにします。
$lattePath = "<path_to_latte_exe>" New-NetFirewallRule -DisplayName Latte -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $lattePath説明お使いの環境に合わせて、
<path_to_latte_exe>をテストインスタンス上の latte.exe ファイルの実際のパスに置き換える必要があります。
-
-
テストインスタンスで、次のコマンドを実行してデータ受信の準備を行います。
$serverIp = (Get-NetIPConfiguration | Where-Object {$_.InterfaceAlias -eq '<name_of_the_network_adapter>'} | Select-Object -ExpandProperty IPv4Address).IPAddress $port = <communication_port> & "<path_to_latte_exe_on_test_instance>" -a "$serverIp`:$port" -i 65535説明-
お使いの環境に合わせて、
<name_of_the_network_adapter>と<path_to_latte_exe_on_test_instance>を置き換える必要があります。Get-NetAdapter | Select-Object Nameコマンドを実行してネットワークアダプター名を取得できます。 -
<communication_port>パラメーターはユーザーが定義します。テストインスタンスと補助テストインスタンスの両方で、同じポート番号を使用する必要があります。
-
-
補助テストインスタンスで、次のコマンドを実行してデータを送信します。
$serverIp = "<test_instance_private_ip_address>" $port = <communication_port> & "<path_to_latte_exe_on_auxiliary_instance>" -c -a "${serverIp}:$port" -i 65535説明-
お使いの環境に合わせて、
<test_instance_private_ip_address>と<path_to_latte_exe_on_auxiliary_instance>を置き換える必要があります。ipconfigコマンドを実行してテストインスタンスのプライベート IP アドレスを取得できます。 -
<communication_port>パラメーターはユーザーが定義します。テストインスタンスと補助テストインスタンスの両方で、同じポート番号を使用する必要があります。
-
-
テスト結果のネットワーク遅延を確認します。
テスト結果の
Latency(usec)の値は、マイクロ秒 (μs) 単位の平均データ伝送レイテンシーを示します。