おれさまラボの実験ノート

実際に手を動かして理解を深めるブログ。

AWS上で速度測定する場合に注意すべきこと

はじめに

新型コロナウィルスのおかげで暇を持て余しており iperf3 で遊んでいたのですが、AWS から速度制限をかけられたと思われる事象が発生しました。結論そうだったので、本記事を読んでみなさんも注意するようにしましょう!

iperf3 とは

iperf3 はネットワーク速度を測定するためのツールです。サーバとクライアントの 2 つの端末を用意し、サーバの役割の端末に対してクライアントの役割の端末からデータを投げつけることで、通信速度を測ることができます。

何をしていたか

パケットキャプチャして Maximum Segment Size(MSS)の挙動を観察したかったのと、iperf3 で MSS サイズを変えて測定した場合の速度変化を観察したかったので連続で測定を行っていました。

具体的には、MSS のサイズを 100 からはじめておおよそ 250 ずつ増やし、パケット数と速度変化を測るという実験をしていました。

EC2 to EC2 の限界は 5 GB ぽいけど、今回の検証は t2.micro でやってたのでそこまで速度でるのかな?という点も確認していました。

参考:The Floodgates Are Open – Increased Network Bandwidth for EC2 Instances | AWS News Blog

どうなったか

8 回目の試行(MSS = 1750)までは順調でした。1 Gbps 弱まで速度が上昇していたのでここが上限なんだろうと考えていました。しかし、9 回目の試行(MSS = 2000)で速度が落ち始め、10 回目の試行(MSS = 2000)から 10 分の 1 程度まで速度低下してしまいました。

その後何度やっても 100 Mbps 以上にはなりませんでした。

なぜこうなったのか

仮説としては AWS から制限がかかったのだろうと考えました。

調べてみるとありました。

aws.amazon.com

AWS のドキュメントによると「お客様のネットワーク負荷テストにおいて、Amazon EC2 インスタンスから生成されるトラフィックが以下の 1 つ以上の条件に当てはまる場合にのみ適用されます」とのことです。具体的には以下 3 点が対象となるそうです。

  • 全体として 1 分を越えて継続する、1 Gbps (10 億ビット/秒) または 1 Gpps (10 億パケット/秒) を超えるもの
  • 不正なまたは悪意のあると見られるトラフィックが生成されるもの
  • 予想されるテストのターゲット以外のエンティティ (ルーティングや共有サービスインフラストラクチャ) に対して影響を与える可能性が存在するもの

おそらく、1 点目に引っかかったと想定されます。

どうすべきだったか

このようなネットワーク負荷テストをする場合には「AWS にテストの評価を依頼」をすべきでした。

負荷テスト受け入れフォームというものが存在するらしく、AWS にメールを送ることで受け入れフォームを手に入れることができるそうです。詳細はドキュメントを参照してください。

参考:テストポリシー - Amazon EC2 | AWS

もうひとつ(真似しないほうがいいと思いますが)、「1 Gbps を超えないように工夫する」という回避方法もアイデアとしてあります。

iperf3 ではネットワーク帯域を制御するオプションが用意されているのでこれを使う方法です。

-b, --bandwidth n[KM]
       set target bandwidth to n bits/sec (default 1 Mbit/sec for UDP, unlimited for TCP).  If there  are  multiple  streams
       (-P  flag),  the  bandwidth  limit  is applied separately to each stream.  You can also add a '/' and a number to the
       bandwidth specifier.  This is called "burst mode".  It will send the given number of packets without pausing, even if
       that  temporarily  exceeds  the  specified bandwidth limit.  Setting the target bandwidth to 0 will disable bandwidth
       limits (particularly useful for UDP tests).  This bandwidth limit is implemented internally  inside  iperf3,  and  is
       available on all platforms.  Compare with the --fq-rate flag.

参考:man iperf3

今回の場合は以下のようなコマンドにしておけばよかったかもしれませんね。

$ iperf3 -c 10.255.1.197 -f M -b 500M -M 9000

おわりに

Amazon EC2 Testing Policy の存在は正直知ってました。でも、やってるときにはぜんぜん思い付きませんでした。実験していると楽しくなっちゃってついつい冷静さを欠いてしまいがちですが、みなさんもどうか冷静な心をもって対応するようにしてください。

おまけ

Amazon Linux 2 では ethtool や mii-tool のようなネットワークコマンドは使えないという知見も今回併せて得ましたので共有しておきます。EC2 の NIC の帯域を見る手段はないみたいですね。

$ sudo mii-tool eth0
SIOCGMIIPHY on 'eth0' failed: Operation not supported
$ sudo ethtool eth0
Settings for eth0:
        Link detected: yes
$ dmesg | grep -i link
[    0.506497] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
[    0.508287] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
[    0.512277] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
[    0.516282] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
[    0.851718] audit: initializing netlink subsys (disabled)
[ 2880.539964] Netfilter messages via NETLINK v0.30.

追記(2020/05/24)

1ヶ月以上待っても解除されることはありませんでした。

計測日 Bandwidth(Mbps) 備考
2020/4/18 78.3 制限掛かった直後の計測結果
2020/4/18 59.3 制限後、約9時間後の計測結果
2020/4/19 59.3
2020/4/21 59.3
2020/4/27 59.0
2020/5/17 59.0
2020/5/24 59.4

以上