한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

ゲームラグ白書 › L5 データセンターのネットワーク機器

クラウドのNATゲートウェイの接続・ポート上限 Cloud NAT gateway connection / port limits

原因ID dc-nat-gateway · 主担当 インフラチーム・ネットワークインフラ · 副担当 ゲーム開発チーム・サーバー開発

図と実験のあるメインページでこのカードを開く →

プライベートサブネットのサーバーから外部(プラットフォーム認証・決済・外部API)への接続は、NATゲートウェイがアドレスとポートを変換して送り出します。同じ宛先への同時接続がゲートウェイのポート上限を超えると、新しい接続が失敗します。

なぜ サーバー群が、プラットフォーム認証・決済のような同じ外部アドレスへ短い接続を大量に開くか、接続を長く開いたままにする → すると NATゲートウェイがその宛先に使う送信元ポートをこれ以上割り当てられず、新しい接続が失敗 → 画面では ゲーム内は問題ないのに、ログイン・決済・報酬付与のように外部を呼び出す機能だけが失敗するか遅れる(接続不可・無限ロード、不発・ロールバック)

症状
接続不可・無限ロード, 不発・ロールバック
要因
パケットロス, 遅延
誰に起きるか
特定の機能だけ, サーバー全体
いつ
接続直後・メンテ明け, 夜のピーク時間帯, 人が集中したとき
担当
主担当 インフラチーム・ネットワークインフラ · 副担当 ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応
外部APIは接続を再利用し(HTTP keep-alive、コネクションプール)、リクエストごとに新しい接続を開かない、プールに残したアイドル接続はNATのアイドルタイムアウト(AWSは350秒)より短い間隔でkeepaliveを送るか先に閉じる、失敗したら再試行間隔を延ばしながらランダムに分散、外部呼び出しごとの失敗率・遅延を記録。
インフラチームの対応
NATゲートウェイにIPアドレスを追加(AWSのパブリックNATゲートウェイにはElastic IPをデフォルトで2つまでしか付けられないため、それ以上はクォータの引き上げを申請)、アベイラビリティーゾーン・サブネットごとにゲートウェイを分ける、ポート割り当て失敗のメトリクス(AWSのErrorPortAllocation、AzureのSNAT Connection CountのFailed、Google Cloudのdropped_sent_packets_countのOUT_OF_RESOURCES)にアラート、Google Cloud NATはVMあたりの最小ポート数を増やすか動的ポート割り当てを使う。
数値の目安
AWS NATゲートウェイは、IPアドレス1つで同じ宛先(IP・ポート・プロトコル)に同時接続を55,000まで開くことができ、IPを8つまで付けて増やせます。350秒間通信のない接続は削除し、その後この接続に送られたパケットにはRSTを返します。Azure NAT Gatewayは、パブリックIP 1つあたりSNATポート64,512個(IPは最大16個)です。Google Cloud NATはNAT IP 1つあたり64,512ポートをVMごとに分けて割り当てますが、VMあたりの最小ポート数のデフォルトが64(静的割り当て)のため、デフォルト設定では1台のVMが同じ宛先に同時に開ける接続は、たいてい64に制限されます。
グラフでは
上限で頭打ち · NATゲートウェイの同時接続数、ポート割り当ての失敗数
確認箇所
AWSはCloudWatchのNATゲートウェイのメトリクスErrorPortAllocation・ActiveConnectionCount・PacketsDropCount(AzureはSNAT Connection CountをFailed状態で絞り込んだ値とDropped Packets、Google Cloudはdropped_sent_packets_countのreason OUT_OF_RESOURCES)を、ゲームサーバーの外部呼び出しが失敗した時刻と並べて確認
該当する場合
外部呼び出しが失敗した時刻にErrorPortAllocation(AzureはFailed状態のSNAT Connection Count、Google CloudはOUT_OF_RESOURCESによる破棄)が0より大きくなり、失敗が認証・決済サーバーのように接続が多く集中する1〜2か所の宛先への呼び出しに集まる
該当しない場合
ポート割り当ての失敗が0なのに、ゲームサーバーのconnectがEADDRNOTAVAILで失敗し、TIME_WAITがエフェメラルポートの範囲に迫っていれば「サーバー間接続のエフェメラルポート枯渇」。接続はできるのに応答だけが遅ければ「外部サービスへの依存」
確認手段
インフラのツールで確認(ゲームコード不要)
もっと詳しく
サーバー1台のエフェメラルポートが尽きる「サーバー間接続のエフェメラルポート枯渇」とは異なり、この上限はNATゲートウェイにかかり、ゲートウェイの後ろのサーバー群が共有します(Google Cloud NATはVMごとに分けて割り当て)。サーバー側のTIME_WAITとエフェメラルポートの範囲には余裕があるのに外部呼び出しだけが失敗するなら、こちらです。閉じた接続のポートもすぐには同じ宛先に再利用されないため(Azureはクールダウン、Google CloudはTIME_WAITの間は使用不可)、短い接続を繰り返すほど早く上限に達します。

出典

  1. NAT gateway basics AWS
    IPv4アドレス1つあたり同じ宛先(宛先IP・ポート・プロトコル)へ同時接続55,000、IPを8つまで付けて拡張(パブリックNATゲートウェイのElastic IPはデフォルト2つ、クォータの引き上げ申請で増やす)、帯域幅は5Gbpsから100Gbpsまで、処理量は毎秒100万から1,000万パケットまで自動で増え、その上限を超えるとパケットを破棄
  2. NAT gateway metrics and dimensions AWS
    ErrorPortAllocation:送信元ポートを割り当てられなかった回数(0より大きければ同時接続が多すぎる)、ActiveConnectionCount、IdleTimeoutCount(350秒のアイドルで整理された接続)、PacketsDropCount
  3. Troubleshoot NAT gateways AWS
    350秒アイドルだと接続が期限切れになり、続けて送るとRSTを返す、350秒より短いkeepaliveを推奨、接続上限に達したらアベイラビリティーゾーンごとのゲートウェイ・IPの追加・接続数の削減
  4. Source Network Address Translation (SNAT) with Azure NAT Gateway Microsoft Azure
    パブリックIP 1つあたりSNATポート64,512個(IPは最大16個)、同じ宛先への接続ごとに別のポートが必要、閉じたポートは同じ宛先に再利用する前にクールダウン
  5. Metrics and alerts for Azure NAT Gateway Microsoft Azure
    SNAT Connection CountをFailed状態で絞り込んだ値が0より大きければSNATポート枯渇の可能性、Dropped Packets
  6. IP addresses and ports Google Cloud
    NAT IP 1つあたりTCP・UDPそれぞれ64,512ポート、VMあたりの最小ポートのデフォルトは64(静的割り当て)・32(動的割り当て)、VMに予約されたポート数が同じ宛先への同時接続数を制限、閉じた接続はTIME_WAITの間使えない
  7. Logs and metrics Google Cloud
    dropped_sent_packets_countのreason OUT_OF_RESOURCES:NAT IPやポートが足りずに破棄したパケット

あわせて読みたい原因

同じ層:L5 データセンターのネットワーク機器

同じ症状(接続不可・無限ロード)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る