ゲームラグ白書 › L9 サーバーのゲームプロセス
ブロードキャストの急増 Broadcast fan-out (N×N)
原因ID sp-broadcast · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ
図と実験のあるメインページでこのカードを開く →
1人の動きを、その人が見えている全員に送ると、集まった人数の2乗に比例する数の更新を送ることになります。
なぜ 1人の変化を、それが見える全員に送信 → すると 1,000人が互いを見ていると、ティックごとに100万個の更新 → 画面では 送信キューと帯域幅が飽和して遅延・パケットロス(入力遅延・早送り・ワープ)
症状 入力遅延 , ワープ , 早送り
要因 遅延, パケットロス
誰に起きるか 特定の場所・チャンネル, サーバー全体
いつ 人が集中したとき
担当 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ
ゲーム開発チームの対応 距離・重要度に応じて更新頻度を下げる(近くの敵は毎ティック、遠くの人は1秒に数回)、1人に送る量に上限を設けて重要なものから詰める、複数の更新を1つのパケットにまとめる、表示人数の上限。
インフラチームの対応 サーバーごとの送信帯域幅・毎秒パケット数をNIC・インスタンスのネットワーク上限と比べてアラート、大規模イベントの前に余裕を確認。
数値の目安 1,000人 × 1,000人 × 20ティック = 毎秒2,000万個。1個40バイトならサーバー全体で約6.4Gbps、受信する1人あたり約6.4Mbps。見える人数を150人に制限すると全体で約1Gbps、1人あたり約1Mbps。
グラフでは 人数・負荷に連動して上昇 · サーバーの送信パケット・バイト、1か所に集まった人数
確認箇所 sar -n DEV 1のtxpck/s・txkB/s(サーバーのNICが毎秒送ったパケット数・KB)を人数のグラフと並べて確認。クラウドのインスタンスではethtool -Sの上限超過カウンター(AWS ENAはbw_out_allowance_exceeded・pps_allowance_exceeded) 該当する場合 集まった人数が増えると送信パケット・バイトが人数よりも急激に(2乗に近く)増え、上限に達した時刻から上限超過カウンターや送信の破棄が増加 該当しない場合 送信量は変わらないのにティック時間だけが増えるなら、視界計算・ゲームロジック側 確認手段 インフラのツールで確認(ゲームコード不要)
実際の事例 CCP Games 2014: EVE OnlineのHED-GP大規模艦隊戦でのサーバー過負荷
出典 HED-GP Technical Retrospective: What a HED-ache CCP Games n人の行動をn人が見なければならないO(n²)の送信が、大規模な艦隊戦で避けられない制約要因 Actor Priority in Unreal Engine Epic Games 接続の帯域幅が飽和すると、アクターごとに優先度(距離・視線・最後の送信からの経過時間)を付け、重要なものから帯域幅を配分 Detailed Actor Replication Flow in Unreal Engine Epic Games NetUpdateFrequencyでアクターごとの更新頻度を決め、優先度順に送って接続が飽和したら残りは次のティックに回す sar(1) — Linux manual page sysstat sar -n DEVのrxpck/s・txpck/s(毎秒の受信・送信パケット数)、rxkB/s・txkB/s(毎秒の受信・送信KB) Monitor network performance for ENA settings on your EC2 instance AWS bw_out_allowance_exceeded(送信帯域幅の上限超過)・pps_allowance_exceeded(PPS上限超過)で、キューにたまったか破棄されたパケットの数
あわせて読みたい原因
同じ層:L9 サーバーのゲームプロセス
同じ症状(入力遅延)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る