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

ゲームラグ白書 › 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大規模艦隊戦でのサーバー過負荷

出典

  1. HED-GP Technical Retrospective: What a HED-ache CCP Games
    n人の行動をn人が見なければならないO(n²)の送信が、大規模な艦隊戦で避けられない制約要因
  2. Actor Priority in Unreal Engine Epic Games
    接続の帯域幅が飽和すると、アクターごとに優先度(距離・視線・最後の送信からの経過時間)を付け、重要なものから帯域幅を配分
  3. Detailed Actor Replication Flow in Unreal Engine Epic Games
    NetUpdateFrequencyでアクターごとの更新頻度を決め、優先度順に送って接続が飽和したら残りは次のティックに回す
  4. sar(1) — Linux manual page sysstat
    sar -n DEVのrxpck/s・txpck/s(毎秒の受信・送信パケット数)、rxkB/s・txkB/s(毎秒の受信・送信KB)
  5. Monitor network performance for ENA settings on your EC2 instance AWS
    bw_out_allowance_exceeded(送信帯域幅の上限超過)・pps_allowance_exceeded(PPS上限超過)で、キューにたまったか破棄されたパケットの数

あわせて読みたい原因

同じ層:L9 サーバーのゲームプロセス

同じ症状(入力遅延)を起こすほかの層の原因

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