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

ゲームラグ白書 › 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)
確認手段
ゲームサーバー・クライアントのログ・メトリクスが必要

出典

  1. Lua 5.4 Reference Manual Lua.org
    インクリメンタルモードは回収を小さなステップに分けて実行の合間に挟み込み(ステップを大きく取ると全停止)、世代別モードのmajor回収はすべてのオブジェクトをたどる全停止、collectgarbage("count")はLuaが使っているメモリの総量(KB)

あわせて読みたい原因

同じ層:L10 メモリ

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

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