Netperf と sockperf を使用して、Elastic Compute Service (ECS) インスタンスのパケット転送レート (pps)、ネットワーク帯域幅、およびネットワークレイテンシーをテストします。
データ損失を防ぐため、データが含まれていない新しい ECS インスタンスでネットワークパフォーマンスをテストしてください。
インスタンスタイプのメトリクスは、テスト環境で検証されたものです。実際のパフォーマンスは、インスタンスの負荷やネットワークモデルなどの要因によって異なる場合があります。
前提条件
事前準備
テスト用の ECS インスタンスを作成します。詳細については、「ECS インスタンスのカスタム起動」をご参照ください。
重要正確で比較可能なテスト結果を得るために、同じインスタンスタイプのインスタンスを使用してください。
すべてのテストインスタンスが同じ Virtual Private Cloud (VPC) 内にあり、同じ vSwitch に接続され、同じセキュリティグループに属していることを確認してください。
環境の例
次の表に、テストマシンと補助テストマシンに推奨されるインスタンスタイプと数量を示します。テストシナリオに基づいて、サーバーまたはクライアントとしてマシンを選択してください。
パケット転送レートのテスト (Linux インスタンスのみ)
説明Windows インスタンスのパケット転送レートをテストするためのツールはありません。
6,000,000 pps 未満のパケット転送レート
テスト項目
テストマシン
補助テストマシン
インスタンスタイプ
ecs.g7.large
ecs.g7.large
イメージ
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3
インスタンス数
1
1
ネットワーク
パブリック IP アドレスが割り当てられます。
6,000,000 pps を超え 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 アドレスが割り当てられます。
ネットワーク帯域幅とネットワークレイテンシーのテスト
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 アドレスが割り当てられます。
操作手順
パケット転送レートのテスト (Linux インスタンスのみ)
Windows インスタンスのパケット転送レートをテストするためのツールはありません。
6,000,000 pps 未満のパケット転送レート
テストマシンと補助テストマシンに接続します。詳細については、「ワークベンチを使用して 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.gzGNU Compiler Collection (
GCC) のバージョン番号を確認します。gcc -v 2>&1どちらかのマシンで
GCCが V10 より新しい場合は、GCCが正しくコンパイルされるように、次の操作を実行します。それ以外の場合は、この手順をスキップしてください。nettest_omni.cファイルを開きます。cd netperf vim src/nettest_omni.ci キーを押して挿入モードに入り、
nettest_omni.cから次の宣言済み変数を削除します:/* ソケットの各種オプション */ int loc_nodelay, /* ローカル:NODELAY を使用するか */ rem_nodelay, /* リモート:NODELAY を使用するか */ loc_sndavoid, /* ローカル:送信コピーを回避するか */ loc_rcvavoid, /* ローカル:受信コピーを回避するか */ rem_sndavoid, /* リモート:送信コピーを回避するか */ rem_rcvavoid; /* リモート:受信コピーを回避するか */Esc キーを押し、
:wqと入力して Enter キーを押し、ファイルを保存して閉じます。
Netperf と sar をインストールします。
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=<テストマシンのプライベート IP アドレス> 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<テストマシンのプライベート IP アドレス>を、前の手順で取得した実際のプライベート IP アドレスに置き換えてください。
テストマシンで、パケット転送レートをテストします:
sar -n DEV 1rxpck/s列を確認してください。rxpck/sの値は、1 秒あたりに受信したパケット数を示します。この例では、値は約 940,000 です。
6,000,000 pps を超え 20,000,000 pps 未満のパケット転送レート
テストマシンと補助テストマシンに接続します。詳細については、「ワークベンチを使用して Linux インスタンスにログオン」をご参照ください。
4 台すべてのマシン (補助マシン 3 台とテストマシン 1 台) に 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
各補助テストマシンで、テストマシンにトラフィックを送信します:
server_ip="<テストマシンのプライベート IP アドレス>" 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<テストマシンのプライベート IP アドレス>を実際の値に置き換えてください。run_timeはトラフィックの期間を指定します。4 台すべてのマシンで、パケット転送レートをテストします:
sar -n DEV 1テストマシンの
rxpck/s列を確認してください。rxpck/sの値は、1 秒あたりに受信したパケット数を示します。この例では、値は約 12,000,000 pps です。
20,000,000 pps を超えるパケット転送レート
テストマシンと補助テストマシンに接続します。詳細については、「ワークベンチを使用して Linux インスタンスにログオン」をご参照ください。
4 台すべてのマシン (補助マシン 3 台とテストマシン 1 台) に 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) を CPU コアにバインドします。
IRQ を特定の CPU コアにバインドすると、コンテキストスイッチが減り、高 pps でのパケット処理効率が向上します。
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
各補助テストマシンで、テストマシンにトラフィックを送信します:
server_ip="<テストマシンのプライベート IP アドレス>" 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<テストマシンのプライベート IP アドレス>を実際の値に置き換えてください。run_timeはトラフィックの期間を指定します。4 台すべてのマシンで、パケット転送レートをテストします:
sar -n DEV 1テストマシンの
rxpck/s列を確認してください。rxpck/sの値は、1 秒あたりに受信したパケット数を示します。この例では、値は約 20,000,000 pps です。
ネットワーク帯域幅のテスト
Linux インスタンス
テストマシンと補助テストマシンに接続します。詳細については、「ワークベンチを使用して 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.gzGCCのバージョン番号を確認します。gcc -v 2>&1どちらかのマシンで
GCCが V10 より新しい場合は、GCCが正しくコンパイルされるように、次の操作を実行します。それ以外の場合は、この手順をスキップしてください。nettest_omni.cファイルを開きます。cd netperf vim src/nettest_omni.ci キーを押して挿入モードに入り、
nettest_omni.cから次の宣言済み変数を削除します:/* ソケットの各種オプション */ int loc_nodelay, /* ローカル:NODELAY を使用するか */ rem_nodelay, /* リモート:NODELAY を使用するか */ loc_sndavoid, /* ローカル:送信コピーを回避するか */ loc_rcvavoid, /* ローカル:受信コピーを回避するか */ rem_sndavoid, /* リモート:送信コピーを回避するか */ rem_rcvavoid; /* リモート:受信コピーを回避するか */Esc キーを押し、
:wqと入力して Enter キーを押し、ファイルを保存して閉じます。
Netperf と sar をインストールします。
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[ecs-user@izxxx ecZ ~]$ ifconfig || ip addr eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 17.xxx.xxx.15 netmask 25xxx.0 broadcast 17.xxx.55 inet6 fexxx38:c158 prefixlen 64 scopeid 0x20<link> ether 00:xxx:xxx txqueuelen 1000 (Ethernet) RX packets 178595 bytes 106030163 (101.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 116902 bytes 70189540 (66.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 2 bytes 140 (140.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2 bytes 140 (140.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0補助テストマシンで、テストマシンにトラフィックを送信します:
#!/bin/bash server_ip=<テストマシンのプライベート IP アドレス> 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<テストマシンのプライベート IP アドレス>を、前の手順で取得した実際のプライベート IP アドレスに置き換えてください。#!/bin/bash server_ip=<テストマシンのプライベート IP アドレス> 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 [1] 5100 [2] 5101 [3] 5102 [4] 5103テストマシンで、ネットワーク帯域幅をテストします:
sar -n DEV 1rxkB/s列を確認してください。rxkB/sの値は、受信したパケットサイズを KB/s で示します。8 を掛けて Kbit/s に変換すると、ネットワーク帯域幅の値になります。
Windows インスタンス
テストマシンと補助テストマシンに接続します。詳細については、「パスワードまたはキーを使用して Windows インスタンスに接続」をご参照ください。
両方のマシンにテストツールをインストールし、ファイアウォールを無効にします。
ntttcp.exe ツールをダウンロードし、ツールが保存されているパスを取得します。
[ファイル名を指定して実行] ダイアログボックスを開きます。powershell と入力し、[OK] をクリックして PowerShell を起動します。
接続がブロックされるのを防ぐために、両方のマシンでファイアウォールを無効にします:
Set-NetFirewallProfile -Profile * -Enabled:falseまたは、両方のマシンで ntttcp.exe を許可する受信ファイアウォールルールを作成します:
$ntttcpPath = "<ntttcp.exe のパス>" New-NetFirewallRule -DisplayName ntttcp -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $ntttcpPath説明<ntttcp.exe のパス>を実際の値に置き換えてください。
テストマシンで、ネットワークアダプターの受信側スケーリング (RSS) を設定します。
RSS は、受信したパケットを複数の CPU コアに分散させて、ネットワークパフォーマンスを向上させます。CPU 数に基づいて RSS キューを設定します:
マシンの CPU コアが 16 個までの場合、RSS 受信キューの数を CPU コア数に設定します。
マシンの CPU コアが 16 個を超える場合は、RSS を無効にします。ほとんどのネットワークアダプターは最大 16 個の RSS キューをサポートしているため、この制限を超えるとリソース割り当てが不均一になる可能性があります。
$cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors if ($cpuNum -le 16) { Set-NetAdapterRss -Name <テストマシンのネットワークアダプターの名前> -NumberOfReceiveQueues $cpuNum } else { Disable-NetAdapterRss -Name <テストマシンのネットワークアダプターの名前> }説明<テストマシンのネットワークアダプターの名前>を実際の値に置き換えてください。Get-NetAdapter | Select-Object Nameを実行してアダプター名を取得できます。RSS 設定を変更すると、ネットワークアダプターサービスが再起動され、接続が中断される場合があります。続行する前に、再接続を待ってください。
テストマシンで、データを受信する準備をします:
$serverIp = (Get-NetIPConfiguration -InterfaceAlias <テストマシンのネットワークアダプターの名前>).IPv4Address.IPAddress $cpuNum = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors $threadNum = $cpuNum & <テストマシン上の ntttcp.exe のパス> -r -m $threadNum,0,$serverIp -t 300説明<テストマシンのネットワークアダプターの名前>と<テストマシン上の ntttcp.exe のパス>を実際の値に置き換えてください。補助テストマシンで、データを送信します:
$serverIp = "<テストマシンのプライベート IP アドレス>" $threadNum = "<テストマシンのスレッド数>" <補助テストマシン上の ntttcp.exe のパス> -s -m $threadNum,*,$serverIp -t 100説明<テストマシンのプライベート IP アドレス>、<テストマシンのスレッド数>、および<補助テストマシン上の ntttcp.exe のパス>を実際の値に置き換えてください。ipconfigを実行してプライベート IP アドレスを取得し、$cpuNumを実行してスレッド数を取得します。テストマシンでネットワーク帯域幅を確認します。
Throughput (MB/s)の値は、ネットワーク帯域幅を示します。
ネットワークレイテンシーのテスト
Linux インスタンス
テストマシンと補助テストマシンに接続します。詳細については、「ワークベンチを使用して 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コマンド出力では、eth0 インターフェイスの inet アドレスがインスタンスのプライベート IP アドレスです。
[ecs-user@izxxx ecZ ~]$ ifconfig || ip addr eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 17.xxx.xxx.15 netmask 25xxx.0 broadcast 17.xxx.55 inet6 fexxx38:c158 prefixlen 64 scopeid 0x20<link> ether 00:xxx:xxx txqueuelen 1000 (Ethernet) RX packets 178595 bytes 106030163 (101.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 116902 bytes 70189540 (66.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 2 bytes 140 (140.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2 bytes 140 (140.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0テストマシンで、sockperf を起動します:
sockperf sr --tcp --daemonize補助テストマシンで、テストマシンにトラフィックを送信します:
sockperf pp -i <テストマシンのプライベート IP アドレス> --tcp -t 30 -m 14 --full-log=result.json<テストマシンのプライベート IP アドレス>を、前の手順の実際の値に置き換えてください。ネットワークレイテンシーの結果を確認します。
結果の各項目は次のとおりです:
avg-latency:マイクロ秒単位の平均レイテンシー。percentile 99.000:マイクロ秒単位の 99 パーセンタイルのレイテンシー。

Windows インスタンス
テストマシンと補助テストマシンに接続します。詳細については、「パスワードまたはキーを使用して Windows インスタンスに接続」をご参照ください。
両方のマシンにテストツールをインストールし、ファイアウォールを無効にします。
latte.exe ツールをダウンロードし、ツールが保存されているパスを取得します。
[ファイル名を指定して実行] ダイアログボックスを開きます。powershell と入力し、[OK] をクリックして PowerShell を起動します。
接続がブロックされるのを防ぐために、両方のマシンでファイアウォールを無効にします:
Set-NetFirewallProfile -Profile * -Enabled:falseまたは、両方のマシンで latte.exe を許可する受信ファイアウォールルールを作成します:
$lattePath = "<latte.exe のパス>" New-NetFirewallRule -DisplayName Latte -Protocol Any -Direction Inbound -Action Allow -Enabled True -Profile Any -Program $lattePath説明<latte.exe のパス>を実際の値に置き換えてください。
テストマシンで、データを受信する準備をします:
$serverIp = (Get-NetIPConfiguration | Where-Object {$_.InterfaceAlias -eq '<テストマシンのネットワークアダプターの名前>'} | Select-Object -ExpandProperty IPv4Address).IPAddress $port = <通信ポート> & "<テストマシン上の latte.exe のパス>" -a "$serverIp`:$port" -i 65535説明<テストマシンのネットワークアダプターの名前>と<テストマシン上の latte.exe のパス>を実際の値に置き換えてください。Get-NetAdapter | Select-Object Nameを実行してアダプター名を取得できます。<通信ポート>にポート番号を指定してください。両方のマシンで同じポートを使用してください。
補助テストマシンで、データを送信します:
$serverIp = "<テストマシンのプライベート IP アドレス>" $port = <通信ポート> & "<補助テストマシン上の latte.exe のパス>" -c -a "${serverIp}:$port" -i 65535説明<テストマシンのプライベート IP アドレス>と<補助テストマシン上の latte.exe のパス>を実際の値に置き換えてください。ipconfigを実行してプライベート IP アドレスを取得します。<通信ポート>にポート番号を指定してください。両方のマシンで同じポートを使用してください。
ネットワークレイテンシーの結果を確認します。
Latency (usec)の値は、マイクロ秒単位の平均ネットワークレイテンシーを示します。