NAT Gatewayの性能を確認する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。
最近はVPCを構成する時にEC2ベースのNATインスタンスではなくNAT Gatewayを使用することが多いのですが、ドキュメントにある「バーストが最大 10 Gbps の帯域幅をサポートします」という文言が気になっていたので、性能を確認してみました。

NAT Gatewayの性能とは

NAT ゲートウェイのドキュメントにはNAT Gatewayの性能について以下の記載があります。

NAT ゲートウェイは、バーストが最大 10 Gbps の帯域幅をサポートします。10 Gbps を超えるバーストが必要な場合は、リソースを分割して複数のサブネットに配置し、サブネットごとに NAT ゲートウェイを作成することで、ワークロードを分散できます。

ドキュメントではバーストして最大10 Gbpsの帯域が出ると書かれていますが、「バースト」について記載がありません。
T2インスタンスやEBSの汎用SSDボリューム(gp2)の場合は「バースト」の特性について記載があるのでキャパシティを考えやすいのですが、NAT Gatewayは実際に挙動を確認してみるしかありません。

計測方法

計測環境の概要は、以下の図になります。
NAT Gatewayを経由する通信にするためには、送信元インスタンスを配置したSubnetでRoute Tableを設定する必要があります。

計測に使用したEC2インスタンスは下表の内容です。

項目 内容 備考
仕様OS Amazon Linux 2015.09 計測時に最新のAmazon Linux
インスタンスサイズ c3.8xlarge ネットワーキングパフォーマンスが最大の10GbpsのEC2で最も低価格であるため
計測ツール nuttcp 7.2.1 Amazon Linuxの標準リポジトリにあるため
拡張ネットワーキング 有効 Amazon Linux 2015.09とc4.8xlargeでは標準で有効化されている
MTU 1500 ドキュメントにインターネットゲートウェイを介すると1500 MTUに制限される記載がある

NAT Gateway無しの状態でc3.8xlarge同士(同一AZ)でInternet Gatewayを経由した計測を行うと4 Gbps程度の帯域がでます。10Gbpsを上回る負荷を与えられるように合計で3セット(12Gbps程度の負荷)を準備しました。

送信先インスタンスの各々で、以下のコマンドを実行してnuttcpのサーバを起動します。

$ nuttcp -S

送信元インスタンスの各々で、以下のコマンドを実行して1秒ごとの状況を表示して1800秒間(30分間)通信をします。

$ nuttcp -i1 -T1800 <送信先インスタンスのIPアドレス>

※:本当は1時間以上継続したかったのですが、お金がかかるので諦めて30分にしました。。。

計測結果

計測結果をグラフにまとめました。

graph

一目瞭然ですが、負荷をかけた瞬間から 7.5Gbps 程度の性能を発揮して30分間ほぼ一定の性能を維持し続けました。25:25周辺でスループットが250Mbps程度低下していますが、その後は性能に変化はありませんでした。
TCPで7Gbps以上の性能が安定的に出ているので、10Gbpsの帯域を十分に活用できている数値ではないかと思います。

まとめ

残念ながら30分程度ではNAT Gatewayのバーストの底が見えないという結果になってしまいました。NAT Gatewayは帯域がバーストするという記述がありますが30分程度であれば、安定的に10Gbpsに近い性能を発揮します。是非、バーストの挙動についてドキュメントに追記して欲しいと思います。
NATインスタンスで同等の性能を出すためには、8xlarge以上のインスタンス(1台では足りないかもしれません)を使用する必要があるため通信をしなくても高額な待機コストが発生します。それと比較するとNAT Gatewayは$0.062/時の待機コストしかかかりません。通信料に対する料金は$0.062/GBと高額であるため注意が必要ですが、一時的に広帯域が必要になるケースでは非常に安価にNAT処理をすることができるのではないでしょうか?