VPCのAmazon EC2内にサーバーのセットがあります。このVPC内には、プライベートサブネットとパブリックサブネットがあります。パブリックサブネットで、基本的に実行されるt2.microインスタンスにNATマシンをセットアップしました このNATスクリプト 起動時にルールをiptablesに注入します。プライベートサブネット内のマシンからインターネットからファイルをダウンロードすることは正常に機能します。
ただし、外部の高帯域幅FTPサーバー上のファイルのダウンロード速度をNATマシンから直接、プライベートサブネット内のマシンからのダウンロード速度と比較しました(同じNATを介して)機械)。本当に大きな違いがありました:プライベートサブネット内のマシンからダウンロードする場合、NATマシンから約10MB/s対1MB/s。
NATマシンではCPU使用率がないため、これがボトルネックになることはありません。より大きなマシン(「中程度のネットワークパフォーマンス」を備えたm3.mediumおよび「高いネットワークパフォーマンス」を備えたm3.xlarge)で同じテストを試みると、2.5MB /秒を超えるダウンロード速度も得られませんでした。
これは、チューニング可能な一般的なNAT問題ですか?パフォーマンスの低下はどこから発生しますか?
更新
いくつかのテストで、この問題を絞り込むことができました。 2013年からUbuntu 12.04またはAmazon Linux NATマシンを使用している場合、すべてがスムーズに実行され、最小のt2.microインスタンスでも完全なダウンロード速度が得られます。 PVマシンとHVMマシンのどちらを使用するかは関係ありません。問題はカーネルに関連しているようです。これらの古いマシンにはカーネルバージョン3.4.xがありますが、新しいAmazon Linux NATマシンまたはUbunut 14.XXにはカーネルバージョン3.14.XXがあります。新しいマシンを調整する方法はありますか?
ようやく解決策を見つけました。 NATマシン(ルートとして)で実行することにより、ダウンロード速度を修正できます。
ethtool -K eth0 sg off
これにより、スキャッターギャザーモードが無効になり、(私が理解している限り)ネットワークカード自体の一部のネットワーク作業のオフロードが停止します。このオプションを無効にすると、CPU自体が処理を実行する必要があるため、クライアントでのCPU使用率が高くなります。ただし、t2.microマシンでは、DVDイメージをダウンロードするときにCPU使用率の約5%しか確認できませんでした。
これは再起動に耐えられないことに注意してください。したがって、これをrc.local
に設定するか、少なくともNATを設定する前に設定してください。
私もNATボックスを本番環境で同様の設定で使用しているため、調査結果に非常に興味があります。製作前に同様の調査結果がありませんでしたが、おそらく私が注意を払っていなかった問題です。前。
科学しましょう!
================================================== ==========================
理論:NATボックスは、NATを使用しているクライアントよりも速くダウンロードおよびアップロードできます。
実験:質問者の実験と一致させます。 Amazonのt2.micros NAT 2014.09 2つのサブネットNAT IGWに移動し、プライベートサブネットがNATを指しています。(共有テナンシー。汎用SSD)
手順:
# install speedtest
$ Sudo yum install python-pip -y --enablerepo=epel; Sudo pip install speedtest-cli
# run against the same server
$ speedtest-cli --server 935 --simple
# run it many times
$ for ((n=0;n<10;n++)); do speedtest-cli --simple --server 935; done
データ:
Nat: Client
Download 727.38 157.99
Upload 250.50 138.91
結論:OPは嘘をついていません。
================================================== ==========================
理論:カーネルのバージョンが異なると、結果も異なります。
実験:それぞれ磁気SSD、m3.medium(バーストなし)、専用テナンシーを備えた3つのNATボックスをセットアップします。速度テストを実行します。
手順:最後の実験を参照してください。また、NATボックスごとにルーティングテーブルを設定します。ルーティングテーブルを交換したときに変更が伝播されたことを証明するために、ブラックホールルーティングテーブルを使用しました。
curl google.com
は機能します。curl google.com
が失敗するまで待ちます。curl google.com
は機能します。これが私の3つのnatボックスです:2014.09 3.14.20-20.44.amzn1.x86_64 2014.03 3.10.42-52.145.amzn1.x86_64 2013.09 3.4.62-53.42.amzn1.x86_64
データ:
speedtest-cli --server 935
を実行すると、3つのボックスすべてで非常に類似した結果が得られます
09/14 03/14 09/13
355.51, 356.55, 364.04
222.59, 212.45, 252.69
クライアントから:
09/14 03/14 09/13
351.18, 364.85, 363.69
186.96, 257.58, 248.04
結論:劣化はありますか?いいえ。カーネルのバージョンに違いはありますか?番号。
================================================== ==========================
理論:専用テナンシーと共有テナンシーは違いをもたらします。
実験:2 NATボックス。両方ともNAT 2014.09を使用。1つは共有テナンシー、もう1つは専用テナンシー。
データ:どちらのボックスも同様のパフォーマンスです。
Shared Nat Dedicated Nat
387.67 387.26
296.27 336.89
また、標準偏差も同様です。
$ python3
>>> import statistics
>>> shared_download = [388.25, 333.66, 337.44, 334.72, 338.38, 335.52, 333.73, 333.28, 334.43, 335.60]
>>> statistics.stdev(shared_download)
16.858005318937742
>>> dedicated_download = [388.59, 338.68, 333.97, 337.42, 326.77, 346.87, 336.74, 345.52, 362.75, 336.77]
>>> statistics.stdev(dedicated_download)
17.96480002671891
そして、2x2の組み合わせを実行すると:
Shared Client/Sh. NAT Sh. Client/Dedicated Nat Ded. Client/Sh. Nat Ded. Client/Ded. NAT
Upload 290.83 288.17 283.13 340.94
Download 260.01 250.75 248.05 236.06
結論:共有か専用かがはっきりしない場合でも、大きな違いはないようです。
おそらくやり直す価値があるテストは、m3.mediumsを使用したOPのテストです。 t2.microの結果を複製することはできましたが、私のm3.mediumはOPのm3.mediumの結果と競合するようです。
カーネルバージョンに関するデータも確認してください。
おそらく、最も興味深い部分は、m3.medium NATをすばやく取得することができなかったことです。
私のテストでは、これによりダウンロードが悪化したことがわかりました。
m3.large speedtestサーバーm3.medium専用NATサーバー。
この環境では他のトラフィックはありません。
平均ダウンロード速度のsg:292.19平均ダウンロード速度のsgオフ:259.21
私のテストは:((n = 0; n <10; n ++)); speedtest-cli --simpleを実行します。できた