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

ゲームラグ白書 › L10 メモリ

アロケーションの急増 Allocation storms

原因ID mem-alloc · 主担当 ゲーム開発チーム・サーバー開発

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

イベント中に一時オブジェクトを大量に生成すると、GCが普段よりはるかに頻繁に走ります。

なぜ アイテムドロップ・戦闘ログ・イベント報酬で一時オブジェクトが急増 → すると GCが数倍の頻度で走り、まだ破棄されていなかったオブジェクトがOld領域に移ってFull GCも早まる → 画面では イベント時だけ周期的に一瞬止まる

症状
カクつき, フリーズ
要因
ストール
誰に起きるか
サーバー全体, 特定の場所・チャンネル
いつ
人が集中したとき
担当
主担当 ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応
オブジェクトプール、バッファの再利用、アロケーションのプロファイリング。
グラフでは
人数・負荷に連動して上昇 · GC回数、アロケーション速度
確認箇所
GCログ(Java -Xlog:gc、Go GODEBUG=gctrace=1)で1分あたりのGC回数を数え、.NETはdotnet-countersのアロケーション量とGC回数(.NET 9以降はdotnet.gc.heap.total_allocated・dotnet.gc.collections、8以前はAllocation Rate・Gen 0 GC Count)を確認。同時接続数・イベントの時刻と重ねて確認
該当する場合
イベントが始まると、アロケーション速度とGC回数が人数の増加より急激に増え、短い停止が頻発。イベントが終わると元に戻る
該当しない場合
GC回数は変わらないのに1回の停止が長くなるなら、生存データが増えている(mem-gc-thrash、mem-leak)
確認手段
インフラのツールで確認(ゲームコード不要)

出典

  1. Garbage Collector Implementation Oracle
    Young領域が埋まるとminor GC、生き残ったオブジェクトの一部がOld領域に移され、Oldが埋まるとヒープ全体を回収(minorよりはるかに時間がかかる)、-Xlog:gcはGCごとに1行ずつ記録
  2. A Guide to the Go Garbage Collector Go
    アロケーション速度が高いほどGCサイクルが頻繁になる、GODEBUG=gctrace=1でGCトレースを出力
  3. dotnet-counters diagnostic tool .NET
    .NET 9以降はdotnet.gc.heap.total_allocated・dotnet.gc.collections、.NET 8以前はAllocation Rate・Gen 0 GC Countで表示

あわせて読みたい原因

同じ層:L10 メモリ

同じ症状(カクつき)を起こすほかの層の原因

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