ゲームラグ白書 › 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)
- 確認手段
- インフラのツールで確認(ゲームコード不要)
出典
- Garbage Collector Implementation Oracle
Young領域が埋まるとminor GC、生き残ったオブジェクトの一部がOld領域に移され、Oldが埋まるとヒープ全体を回収(minorよりはるかに時間がかかる)、-Xlog:gcはGCごとに1行ずつ記録 - A Guide to the Go Garbage Collector Go
アロケーション速度が高いほどGCサイクルが頻繁になる、GODEBUG=gctrace=1でGCトレースを出力 - dotnet-counters diagnostic tool .NET
.NET 9以降はdotnet.gc.heap.total_allocated・dotnet.gc.collections、.NET 8以前はAllocation Rate・Gen 0 GC Countで表示
あわせて読みたい原因
同じ層:L10 メモリ
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る