ゲームラグ白書 › L9 サーバーのゲームプロセス
アップデートによるトラフィックパターンの変化 Patch changes traffic pattern
原因ID sp-patch-traffic · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, インフラチーム・ネットワークインフラ
図と実験のあるメインページでこのカードを開く →
新しいコンテンツ・エフェクト・同期項目がパケットのサイズと頻度を増やすと、問題なく動いていたサーバーがアップデート後からMTU・帯域幅・パケット数の上限に引っかかります。
なぜ アップデートで新しいスキルエフェクト・同期項目・アイテム情報が増え、パケットが大きくなるか頻繁になる → すると 大きなパケットはMTUを超えてフラグメント化され、増えた分は帯域幅・クラウドのPPS上限・送信バッファに引っかかる → 画面では アップデート直後から、混雑した場所でワープ・スキル不発・入力遅延。インフラは何も変えていないのにパケットロスが増える
- 症状
- ワープ, 不発・ロールバック, 入力遅延
- 要因
- パケットロス, 遅延
- 誰に起きるか
- サーバー全体, 特定の場所・チャンネル, 特定の地域・ISP
- いつ
- 人が集中したとき, 夜のピーク時間帯, 常に
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, インフラチーム・ネットワークインフラ
- ゲーム開発チームの対応
- パケットを1,200バイト以下に自前で分割、新しい同期項目は変更分だけを送り、距離・重要度に応じて頻度を下げる、デプロイ前にテストサーバーでユーザーあたりの毎秒パケット数・バイト数と最大パケットサイズを前のビルドと比較、トラフィックのメトリクスにビルドバージョンを記録。
- インフラチームの対応
- サーバー機器・OS:デプロイ時刻をグラフに表示し、ユーザーあたりの毎秒パケット数・バイト数と平均パケットサイズをデプロイ前後で比較、インスタンスの上限超過カウンターにアラート、必要ならより大きなインスタンス。ネットワーク:ファイアウォール・ロードバランサー・DDoS対策機器の処理上限と、フラグメントを遮断していないかを点検。
- 数値の目安
- UDPパケットは1,200バイト以下なら安全で、インターネットの経路MTUは通常1,500バイト、トンネルを通るとさらに小さくなります(GREトンネルなら1,476バイト)。経路MTUを超えたパケットはフラグメント化されるか破棄され、フラグメント化されたパケットはフラグメントを1つ失うだけで全体が失われます。ユーザーあたりの毎秒パケット数が20%増えればサーバー全体でも20%増えるため、上限近くで使っていたインスタンスはすぐにあふれます。
- グラフでは
- ある時点から階段状に上昇 · ユーザーあたりの毎秒パケット数・バイト数、平均パケットサイズ
- 確認箇所
- デプロイ時刻の前後で、サーバーのNICの毎秒パケット数・バイト数(sar -n DEVのrxpck/s・txpck/s・rxkB/s・txkB/s、EC2ではNetworkPacketsOut・NetworkOut)を同時接続数で割って比較。平均パケットサイズはバイト数 ÷ パケット数、サイズの分布はパケットキャプチャをWiresharkのPacket Lengths統計で確認
- 該当する場合
- デプロイ直後からユーザーあたりのパケット数・バイト数や平均パケットサイズが一段上がったまま推移し、同じ時刻からサーバーが作ったフラグメント数(sar -n IPのfragcrt/s)やインスタンスの上限超過カウンター(AWS ENAのpps_allowance_exceeded・bw_out_allowance_exceeded)が増える
- 該当しない場合
- トラフィックパターンはデプロイ前後で同じなのに遅延・パケットロスだけが増えたなら、同じ時刻のインフラ変更(設定、経路、機器、OS・カーネルのアップデート)を確認
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- 「アップデート前は問題なかった」という報告が来たら、インフラの変更と合わせて最初に確認すべきゲーム側の原因です。パッチノートにネットワークの変更がなくても、新しいエフェクトや同期項目が1つ増えるだけで、混雑した場所では数百人分に掛け算されます。増えたトラフィックが実際に引っかかる箇所は、「UDPパケットのIPフラグメンテーション」「クラウドのPPS上限超過」「NIC帯域幅の飽和」「カーネルのソケットバッファ不足」「中間機器の処理上限超過(ファイアウォール・IPS・DDoS対策)」の各項目で扱います。この項目は、その上限に達する出発点がゲームのアップデートだった場合なので、上限を引き上げる前に、アップデートで増えたトラフィックをまず減らします。同じ時刻にOS・カーネルもアップデートしていたなら、ユーザーあたりのトラフィックが変わったかどうかで「OS・カーネル・ドライバー・ファームウェアのアップデート後の性能変化」と切り分けます。
出典
- RFC 8085: UDP Usage Guidelines IETF
UDPアプリケーションは経路MTUを超えるデータグラムを送るべきではない(SHOULD NOT)、フラグメントを1つ失うとフラグメント化されたパケット全体が失われ、一部のNAT・ファイアウォールはフラグメントをすべて破棄 - RFC 8899: Packetization Layer Path MTU Discovery for Datagram Transports IETF
UDPなどのデータグラム通信の基本となる安全なサイズ(BASE_PLPMTU)として1,200バイトを推奨 - Maximum transmission unit and maximum segment size Cloudflare
インターネットの経路MTUは1,500、GREトンネルを通ると1,476 - Monitor network performance for ENA settings on your EC2 instance AWS
pps_allowance_exceeded・bw_out_allowance_exceeded:インスタンスのPPS・送信帯域幅の上限を超えて、キューにたまったか破棄されたパケットの数 - sar(1) — Linux manual page sysstat
sar -n DEVのrxpck/s・txpck/s(毎秒のパケット数)・rxkB/s・txkB/s(毎秒のKB)、sar -n IPのfragcrt/s(毎秒作成したIPフラグメント数、ipFragCreates) - CloudWatch metrics that are available for your instances AWS
NetworkPacketsOut(インスタンスがすべてのネットワークインターフェースから送信したパケット数)・NetworkOut(送信したバイト数) - 8.7. Packet Lengths Wireshark
キャプチャしたパケットを長さの区間ごとに分け、件数・平均・最小・最大を表示
あわせて読みたい原因
同じ層:L9 サーバーのゲームプロセス
同じ症状(ワープ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る