ゲームラグ白書 › L10 メモリ
スクリプトエンジンのGC停止 Scripting VM GC (Lua, etc.)
原因ID mem-script-gc · 主担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
C++のサーバーでも、クエスト・AI・スキルをLuaなどのスクリプトで動かしていると、スクリプトエンジンのGCが走っている間そのゾーンが止まります。
なぜ ゾーンごとにスクリプトエンジンがクエスト・AI・イベントを実行し、一時オブジェクトを大量に生成 → すると スクリプトエンジンのGCが一度に大量に回収すると、そのゾーンのティックが止まる → 画面では 特定のゾーン・特定のイベント中だけ周期的に一瞬止まる
- 症状
- カクつき, フリーズ
- 要因
- ストール
- 誰に起きるか
- 特定の場所・チャンネル
- いつ
- 人が集中したとき, 一定の周期で
- 担当
- 主担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- インクリメンタル・世代別GCの設定、ティックごとに少しずつGCを進める、スクリプトの一時オブジェクトの削減。
- 数値の目安
- スクリプトのヒープが数百MBまで膨らむと、一度にまとめて行う回収(インクリメンタル回収を無効にした場合や、世代別モードでの全体回収)に数十〜数百msかかることもあります。
- グラフでは
- 周期的なスパイク · ゾーン別のティック時間、スクリプトエンジンのメモリ
- 確認箇所
- ゾーン別のティック時間と、そのゾーンのスクリプトエンジンのメモリ使用量(Luaはcollectgarbage("count"))をティックごとに記録し、1つのグラフに重ねて確認
- 該当する場合
- スクリプトのメモリがガクッと下がる瞬間(一度にまとめて回収)とそのゾーンのティックのスパイクが重なり、他のゾーンは正常
- 該当しない場合
- スクリプトのメモリに変化がないまま跳ねるなら、そのゾーンの負荷かロック。サーバーのすべてのゾーンが同時に跳ねるなら、サーバーのGC(mem-gc)かスワップ(mem-swap)
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Lua 5.4 Reference Manual Lua.org
インクリメンタルモードは回収を小さなステップに分けて実行の合間に挟み込み(ステップを大きく取ると全停止)、世代別モードのmajor回収はすべてのオブジェクトをたどる全停止、collectgarbage("count")はLuaが使っているメモリの総量(KB)
あわせて読みたい原因
同じ層:L10 メモリ
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る