ゲームラグ白書 › L13 サーバー構成と運用
ゲートウェイ・プロキシ経由 Gateway / proxy hop
原因ID in-gateway · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
クライアントとゲームサーバーの間に中継サーバーを置くと、経由するたびに処理時間が加わり、そのサーバーが単一障害点になります。
なぜ クライアント ↔ ゲートウェイ ↔ ゲームサーバーの構成 → すると 中継サーバーでの処理・待ちが加わり、過負荷になると全員に影響 → 画面では 全体のPingが上昇、ゲートウェイ障害時はそこを経由するユーザー全員が切断
- 症状
- 入力遅延, 切断
- 要因
- 遅延, ストール
- 誰に起きるか
- サーバー全体
- いつ
- 人が集中したとき, 常に
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:ゲートウェイを複数台に増やせる構成、ゲートウェイが落ちても別のゲートウェイにつなぎ直せばキャラクターがそのまま引き継がれる仕組み(セッション再接続)。クライアント:ゲートウェイとの接続が切れたら自動で再接続。
- インフラチームの対応
- ゲートウェイの水平スケーリング(台数追加)、ゲートウェイごとのCPU・接続数・処理遅延の監視。
- 数値の目安
- 同じデータセンター内なので、普段は1回の経由で1ms未満です。ゲートウェイが過負荷になると数十〜数百msに延びます。
- グラフでは
- 人数・負荷に連動して上昇 · ゲートウェイの処理遅延、ゲートウェイのCPU・接続数
- 確認箇所
- ゲートウェイのCPU・接続数とゲートウェイのソケットのRecv-Q(ss・netstat)、ゲートウェイを通る前と後の遅延の差。サービスメッシュを経由するHTTP・gRPC呼び出しなら、Istioの標準メトリクスistio_request_duration_millisecondsを送信側(reporter=source)と受信側(reporter=destination)に分けて比較
- 該当する場合
- ゲームサーバーの処理時間は変わらないのにゲートウェイ区間の遅延だけが増え、その時刻にゲートウェイのCPUが飽和しているかRecv-Qがたまっている
- 該当しない場合
- ゲートウェイを経由しない経路(直接接続、別のゲートウェイ)も同じように遅ければ、回線かゲームサーバー側
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- サービスメッシュ(Istioなど)を使うと、サーバーごとに横に付くサイドカープロキシ(Envoy)も1段加わります。サービス間のリクエストは送信側のサイドカーと受信側のサイドカーを順に経由し、プロキシにログ・メトリクス収集などの機能を足すほど、処理時間と待ち時間が増えます。
- 実際の事例
- Riot Games 2020: League of Legendsの欧州・ブラジルサーバーでのエッジホスト過負荷
出典
- The Unique Architecture behind Amazon Games’ Seamless MMO New World AWS
New Worldでは、クライアントがパブリックアドレスを持つ入口サーバー(REP)4台のうち1台に接続し、その後ろのシミュレーションサーバー(ハブ)と通信 - Designs, Lessons and Advice from Building Large Distributed Systems Google
LADIS 2009の基調講演(Jeff Dean)。同じデータセンター内の往復は約0.5ms - Site Reliability Engineering, Chapter 22: Addressing Cascading Failures Google
過負荷でキューが長くなると、待ち時間が処理時間の数倍に延びる(処理100ms、キューがスレッド数の10倍なら1.1秒) - Performance and Scalability Istio
サイドカーモードでは、リクエストは送信側と受信側のサイドカープロキシを順に経由、機能を足すほどプロキシ内の処理経路が長くなり、テレメトリ収集が次のリクエストの待ち時間を延ばす - What is Envoy Envoy
Envoyはすべてのアプリケーションサーバーの横で別に動くプロセスで、アプリはlocalhostのEnvoyを経由して通信 - Istio Standard Metrics Istio
istio_request_duration_milliseconds(HTTP・gRPCリクエストの処理時間の分布)、reporterラベルで送信側(source)・受信側(destination)のプロキシを区別 - netstat(8) — Linux manual page net-tools
Recv-Q:接続済みソケットで、ユーザープログラムがまだ読み取っていないバイト数
あわせて読みたい原因
同じ層:L13 サーバー構成と運用
同じ症状(入力遅延)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る