はじめに
新型コロナウィルスのおかげで暇を持て余しており iperf3 で遊んでいたのですが、AWS から速度制限をかけられたと思われる事象が発生しました。結論そうだったので、本記事を読んでみなさんも注意するようにしましょう!
2つのEC2間でiperf3による測定をやりまくっているとおそらくAWSから速度制限がかけられてしまうという知見を得た。ご迷惑おかけして申し訳ございませんでした!
— おれさまラボ (@skksky_tech) 2020年4月18日
左:1時間ほど前の結果
右:さきほどの結果 pic.twitter.com/1r6wAno4df
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 EC2 インスタンスから生成されるトラフィックが以下の 1 つ以上の条件に当てはまる場合にのみ適用されます」とのことです。具体的には以下 3 点が対象となるそうです。
- 全体として 1 分を越えて継続する、1 Gbps (10 億ビット/秒) または 1 Gpps (10 億パケット/秒) を超えるもの
- 不正なまたは悪意のあると見られるトラフィックが生成されるもの
- 予想されるテストのターゲット以外のエンティティ (ルーティングや共有サービスインフラストラクチャ) に対して影響を与える可能性が存在するもの
おそらく、1 点目に引っかかったと想定されます。
どうすべきだったか
このようなネットワーク負荷テストをする場合には「AWS にテストの評価を依頼」をすべきでした。
負荷テスト受け入れフォームというものが存在するらしく、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 | - |
以上