🕸️

【検証】シングルフロートラフィックとマルチフロートラフィックの帯域幅

2024/03/13に公開

Amazon EC2 インスタンスのネットワーク帯域幅

公式ドキュメントに記載の通り、Amazon EC2 インスタンスのネットワーク帯域幅は、シングルフロートラフィック (Single-flow traffic) か、マルチフロートラフィック (Multi-flow traffic) かで異なります。

  • シングルフロートラフィック
    • 最大 5 Gbps まで利用可能
    • クラスタープレイスメントグループを使用した場合、最大 10 Gbps まで利用可能
    • 同じサブネット内かつ ENA Express を設定した場合、最大 25 Gbps まで利用可能
  • マルチフロートラフィック: インスタンスで利用可能なネットワーク帯域幅をすべて利用可能

実際には、帯域幅はもっと様々な要素によってキャップされます。詳細については、公式ドキュメントを見てください。
Amazon EC2 instance network bandwidth - Amazon Elastic Compute Cloud

この記事では、シングルフロートラフィック or マルチフロートラフィックの上限に関わる挙動のみに焦点を当てて、検証していきます。

検証

検証方法

ベンチマークのやり方は、以下の AWS re:Post の記事で解説されています。
Benchmark network throughput between EC2 Linux instances in the same VPC - AWS re:Post

検証環境

2 つの EC2 インスタンスを、以下の条件で起動した検証環境を利用します。

  • リージョン: 同一リージョン (us-east-1)
  • サブネット: 同一サブネット
  • インスタンスタイプ: m6i.metal
  • AMI: Amazon Linux 2023

インスタンスタイプのネットワーク帯域幅

今回、選択した m6i.metal は 50 Gbps までネットワーク帯域幅が利用できます。

$ aws ec2 describe-instance-types --filters "Name=instance-type,Values=m6i.*" --query "InstanceTypes[].[InstanceType, NetworkInfo.NetworkPerformance, NetworkInfo.NetworkCards[0].BaselineBandwidthInGbps]" --output table

------------------------------------------------
|             DescribeInstanceTypes            |
+---------------+----------------------+-------+
|  m6i.24xlarge |  37.5 Gigabit        |  None |
|  m6i.large    |  Up to 12.5 Gigabit  |  None |
|  m6i.8xlarge  |  12.5 Gigabit        |  None |
|  m6i.16xlarge |  25 Gigabit          |  None |
|  m6i.32xlarge |  50 Gigabit          |  None |
|  m6i.metal    |  50 Gigabit          |  None |
|  m6i.4xlarge  |  Up to 12.5 Gigabit  |  None |
|  m6i.xlarge   |  Up to 12.5 Gigabit  |  None |
|  m6i.12xlarge |  18.75 Gigabit       |  None |
|  m6i.2xlarge  |  Up to 12.5 Gigabit  |  None |
+---------------+----------------------+-------+

iperf のインストール

インストール方法は、AWS re:Post の記事の通りです。

sudo yum groupinstall -y "Development Tools"
sudo yum install -y git

cd /usr/local/
sudo git clone https://git.code.sf.net/p/iperf2/code iperf2-code

cd /usr/local/iperf2-code
sudo ./configure
sudo make
sudo make install

以下で、正しくインストールされているか、確認します。

$ which iperf
/usr/local/bin/iperf
$ iperf -v
iperf version 2.1.n (6 March 2024) pthreads

iperf サーバーの起動

起動した 2 つの EC2 インスタンスのいずれか一方で、iperf をサーバーモードで起動しておきます。

  • -s, --server: サーバーモードで起動
  • -p, --port: リッスンするポート番号
sudo iperf -s -p 5001

iperf クライアントのオプション

iperf クライアント側で使うオプションをここで紹介しておきます。

  • -c, --client: クライアントモードで起動
  • -t, --time: 実行する時間
iperf -c <server-private-ip> -t 10

検証結果

フロー クラスタープレイスメントグループ ENA Express 最大帯域幅
シングル なし なし 5 Gbps
シングル あり なし 10 Gbps
シングル なし あり 25 Gbps
マルチ なし なし インスタンスの最大帯域幅 (今回は 50 Gbps)
マルチ あり なし インスタンスの最大帯域幅 (今回は 50 Gbps)
マルチ なし あり インスタンスの最大帯域幅 (今回は 50 Gbps)

検証 1: シングルフロートラフィック

シングルフロートラフィックの最大 5 Gbps の制限に当たっていることがわかります。

$ iperf -c <server-private-ip> -t 10
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  1] local <client-private-ip> port 45002 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  1] 0.00-10.02 sec  5.78 GBytes  4.96 Gbits/sec

検証 2: シングルフロートラフィック (クラスタープレイスメントグループ)

2 つの EC2 インスタンスを同じクラスタープレイスメントグループに配置されることで、シングルフロートラフィックであっても、最大 10 Gbps 近くまで発揮できています。

$ iperf -c <server-private-ip> -t 10
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  1] local <client-private-ip> port 56594 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  1] 0.00-10.01 sec  11.1 GBytes  9.53 Gbits/sec

検証 3: シングルフロートラフィック (ENA Express 有効)

2 つの EC2 インスタンス上で ENA Express を有効にすることで、シングルフロートラフィックであっても、最大 25 Gbps 近くまで発揮できています。
なお、クラスタープレイスメントグループに配置されている必要はありません。

$ iperf -c <server-private-ip> -t 10
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  1] local <client-private-ip> port 34724 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  1] 0.00-10.00 sec  27.9 GBytes  23.9 Gbits/sec

検証 4: マルチフロートラフィック

シングルフロートラフィックで最大 5 Gbps なので、理論的には 10 個の並列したフローがあれば、インスタンスの最大帯域幅 (50 Gbps) まで利用できるはずです。
しっかり 50 Gbps まで利用できています。

$ iperf -c <server-private-ip> -t 10 --parallel 10
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[ 10] local <client-private-ip> port 36544 connected with <server-private-ip> port 5001
[  3] local <client-private-ip> port 36464 connected with <server-private-ip> port 5001
[  1] local <client-private-ip> port 36462 connected with <server-private-ip> port 5001
[  8] local <client-private-ip> port 36492 connected with <server-private-ip> port 5001
[  6] local <client-private-ip> port 36534 connected with <server-private-ip> port 5001
[  2] local <client-private-ip> port 36516 connected with <server-private-ip> port 5001
[  5] local <client-private-ip> port 36460 connected with <server-private-ip> port 5001
[  4] local <client-private-ip> port 36518 connected with <server-private-ip> port 5001
[  9] local <client-private-ip> port 36506 connected with <server-private-ip> port 5001
[  7] local <client-private-ip> port 36476 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  8] 0.00-10.01 sec  5.76 GBytes  4.94 Gbits/sec
[  4] 0.00-10.01 sec  5.76 GBytes  4.94 Gbits/sec
[  5] 0.00-10.01 sec  5.77 GBytes  4.95 Gbits/sec
[  7] 0.00-10.01 sec  5.77 GBytes  4.95 Gbits/sec
[  3] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[ 10] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[  2] 0.00-10.01 sec  5.74 GBytes  4.93 Gbits/sec
[  9] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[  6] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[  1] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[SUM] 0.00-10.01 sec  57.7 GBytes  49.5 Gbits/sec

10 個よりも多いフローにした場合は、インスタンスの最大帯域幅 (50 Gbps) で制限されるはずです。
確かに 30 個のフローを使ったとしても、50 Gbps で制限されています。

$ iperf -c <server-private-ip> -t 10 --parallel 30
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[ 27] local <client-private-ip> port 60432 connected with <server-private-ip> port 5001
[  4] local <client-private-ip> port 60136 connected with <server-private-ip> port 5001
[ 13] local <client-private-ip> port 60154 connected with <server-private-ip> port 5001
[ 10] local <client-private-ip> port 60148 connected with <server-private-ip> port 5001
[ 12] local <client-private-ip> port 60138 connected with <server-private-ip> port 5001
[ 14] local <client-private-ip> port 60140 connected with <server-private-ip> port 5001
[  7] local <client-private-ip> port 60144 connected with <server-private-ip> port 5001
[ 16] local <client-private-ip> port 60258 connected with <server-private-ip> port 5001
[ 25] local <client-private-ip> port 60404 connected with <server-private-ip> port 5001
[ 23] local <client-private-ip> port 60420 connected with <server-private-ip> port 5001
[ 20] local <client-private-ip> port 60206 connected with <server-private-ip> port 5001
[  2] local <client-private-ip> port 60146 connected with <server-private-ip> port 5001
[ 19] local <client-private-ip> port 60170 connected with <server-private-ip> port 5001
[  5] local <client-private-ip> port 60142 connected with <server-private-ip> port 5001
[ 24] local <client-private-ip> port 60470 connected with <server-private-ip> port 5001
[ 28] local <client-private-ip> port 60448 connected with <server-private-ip> port 5001
[  1] local <client-private-ip> port 60254 connected with <server-private-ip> port 5001
[  8] local <client-private-ip> port 60260 connected with <server-private-ip> port 5001
[  6] local <client-private-ip> port 60152 connected with <server-private-ip> port 5001
[ 21] local <client-private-ip> port 60192 connected with <server-private-ip> port 5001
[ 30] local <client-private-ip> port 60482 connected with <server-private-ip> port 5001
[ 29] local <client-private-ip> port 60462 connected with <server-private-ip> port 5001
[  3] local <client-private-ip> port 60190 connected with <server-private-ip> port 5001
[ 11] local <client-private-ip> port 60356 connected with <server-private-ip> port 5001
[ 17] local <client-private-ip> port 60478 connected with <server-private-ip> port 5001
[ 26] local <client-private-ip> port 60406 connected with <server-private-ip> port 5001
[ 15] local <client-private-ip> port 60150 connected with <server-private-ip> port 5001
[ 18] local <client-private-ip> port 60176 connected with <server-private-ip> port 5001
[  9] local <client-private-ip> port 60256 connected with <server-private-ip> port 5001
[ 22] local <client-private-ip> port 60204 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[ 24] 0.00-10.01 sec  1.46 GBytes  1.25 Gbits/sec
[ 14] 0.00-10.01 sec  2.55 GBytes  2.19 Gbits/sec
[ 21] 0.00-10.01 sec  1.58 GBytes  1.35 Gbits/sec
[ 26] 0.00-10.01 sec  1.09 GBytes   932 Mbits/sec
[ 10] 0.00-10.01 sec  2.50 GBytes  2.14 Gbits/sec
[  6] 0.00-10.01 sec  1.38 GBytes  1.19 Gbits/sec
[ 12] 0.00-10.01 sec  1.29 GBytes  1.10 Gbits/sec
[ 11] 0.00-10.01 sec  1.20 GBytes  1.03 Gbits/sec
[ 23] 0.00-10.01 sec  3.98 GBytes  3.42 Gbits/sec
[ 17] 0.00-10.01 sec  1.31 GBytes  1.13 Gbits/sec
[ 16] 0.00-10.01 sec  2.47 GBytes  2.12 Gbits/sec
[ 25] 0.00-10.01 sec  1.21 GBytes  1.04 Gbits/sec
[  5] 0.00-10.01 sec  2.54 GBytes  2.18 Gbits/sec
[ 22] 0.00-10.01 sec  5.78 GBytes  4.96 Gbits/sec
[ 28] 0.00-10.01 sec  1.97 GBytes  1.69 Gbits/sec
[  4] 0.00-10.01 sec  1.31 GBytes  1.13 Gbits/sec
[  2] 0.00-10.01 sec  1.09 GBytes   932 Mbits/sec
[  7] 0.00-10.01 sec  1.18 GBytes  1.02 Gbits/sec
[  3] 0.00-10.01 sec  1.70 GBytes  1.46 Gbits/sec
[ 29] 0.00-10.01 sec  1.24 GBytes  1.06 Gbits/sec
[ 15] 0.00-10.01 sec  2.50 GBytes  2.14 Gbits/sec
[ 27] 0.00-10.01 sec  1.87 GBytes  1.61 Gbits/sec
[ 20] 0.00-10.01 sec  1.91 GBytes  1.64 Gbits/sec
[ 18] 0.00-10.01 sec  1.52 GBytes  1.30 Gbits/sec
[ 19] 0.00-10.01 sec  3.64 GBytes  3.13 Gbits/sec
[ 30] 0.00-10.03 sec  1.30 GBytes  1.12 Gbits/sec
[  8] 0.00-10.03 sec  1.44 GBytes  1.24 Gbits/sec
[  9] 0.00-10.01 sec  2.36 GBytes  2.03 Gbits/sec
[ 13] 0.00-10.01 sec  1.19 GBytes  1.02 Gbits/sec
[  1] 0.00-10.03 sec  1.28 GBytes  1.10 Gbits/sec
[SUM] 0.00-10.03 sec  57.8 GBytes  49.6 Gbits/sec

検証 5: マルチフロートラフィック (クラスタープレイスメントグループ)

クラスタープレイスメントグループに配置されていたとしても、インスタンスの最大帯域幅 (50 Gbps) で制限されます。

$ iperf -c <server-private-ip> -t 10 --parallel 10
------------------------------------------------------------
Client connecting to <server-private-ip>, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  3] local <client-private-ip> port 44864 connected with <server-private-ip> port 5001
[  2] local <client-private-ip> port 44852 connected with <server-private-ip> port 5001
[  1] local <client-private-ip> port 44838 connected with <server-private-ip> port 5001
[  7] local <client-private-ip> port 44892 connected with <server-private-ip> port 5001
[  6] local <client-private-ip> port 44884 connected with <server-private-ip> port 5001
[  4] local <client-private-ip> port 44880 connected with <server-private-ip> port 5001
[  9] local <client-private-ip> port 44896 connected with <server-private-ip> port 5001
[  8] local <client-private-ip> port 44912 connected with <server-private-ip> port 5001
[  5] local <client-private-ip> port 44866 connected with <server-private-ip> port 5001
[ 10] local <client-private-ip> port 44922 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  7] 0.00-10.02 sec  5.79 GBytes  4.97 Gbits/sec
[  4] 0.00-10.02 sec  3.05 GBytes  2.62 Gbits/sec
[  2] 0.00-10.02 sec  11.1 GBytes  9.52 Gbits/sec
[  8] 0.00-10.02 sec  3.17 GBytes  2.72 Gbits/sec
[  9] 0.00-10.02 sec  3.24 GBytes  2.78 Gbits/sec
[  3] 0.00-10.02 sec  3.01 GBytes  2.58 Gbits/sec
[ 10] 0.00-10.02 sec  5.55 GBytes  4.76 Gbits/sec
[  1] 0.00-10.02 sec  11.1 GBytes  9.52 Gbits/sec
[  6] 0.00-10.02 sec  5.77 GBytes  4.95 Gbits/sec
[  5] 0.00-10.02 sec  6.02 GBytes  5.16 Gbits/sec
[SUM] 0.00-10.02 sec  57.8 GBytes  49.6 Gbits/sec

検証 6: マルチフロートラフィック (ENA Express 有効)

ENA Express を有効にしてマルチフロートラフィックを使った場合も、インスタンスの最大帯域幅 (50 Gbps) で制限されます。

$ iperf -c <server-private-ip> -t 10 --parallel 10
------------------------------------------------------------
Client connecting to 172.31.70.174, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  9] local <client-private-ip> port 59386 connected with <server-private-ip> port 5001
[  1] local <client-private-ip> port 59346 connected with <server-private-ip> port 5001
[  2] local <client-private-ip> port 59388 connected with <server-private-ip> port 5001
[  3] local <client-private-ip> port 59344 connected with <server-private-ip> port 5001
[  8] local <client-private-ip> port 59362 connected with <server-private-ip> port 5001
[  6] local <client-private-ip> port 59374 connected with <server-private-ip> port 5001
[ 10] local <client-private-ip> port 59428 connected with <server-private-ip> port 5001
[  5] local <client-private-ip> port 59366 connected with <server-private-ip> port 5001
[  4] local <client-private-ip> port 59398 connected with <server-private-ip> port 5001
[  7] local <client-private-ip> port 59414 connected with <server-private-ip> port 5001
[ ID] Interval       Transfer     Bandwidth
[  5] 0.00-10.01 sec  4.83 GBytes  4.14 Gbits/sec
[  3] 0.00-10.01 sec  9.94 GBytes  8.53 Gbits/sec
[  7] 0.00-10.01 sec  4.58 GBytes  3.93 Gbits/sec
[  1] 0.00-10.01 sec  2.97 GBytes  2.55 Gbits/sec
[ 10] 0.00-10.01 sec  10.5 GBytes  8.99 Gbits/sec
[  9] 0.00-10.01 sec  3.33 GBytes  2.85 Gbits/sec
[  8] 0.00-10.01 sec  3.39 GBytes  2.91 Gbits/sec
[  2] 0.00-10.01 sec  8.97 GBytes  7.69 Gbits/sec
[  6] 0.00-10.01 sec  4.48 GBytes  3.85 Gbits/sec
[  4] 0.00-10.01 sec  4.72 GBytes  4.05 Gbits/sec
[SUM] 0.00-10.01 sec  57.7 GBytes  49.5 Gbits/sec
GitHubで編集を提案

Discussion