한국어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"))을 틱마다 기록해 한 그래프에 겹쳐 봄
이러면 맞음
스크립트 메모리가 뚝 떨어지는 순간(한 번에 몰아서 수집)과 그 존의 틱 튐이 겹치고, 다른 존은 멀쩡함
이러면 아님
스크립트 메모리 변화 없이 튀면 그 존의 부하나 락. 서버의 모든 존이 동시에 튀면 서버 GC(mem-gc)나 스왑(mem-swap)
확인 수단
게임 서버·클라이언트의 로그·지표가 필요

출처

  1. Lua 5.4 Reference Manual Lua.org
    점진적 모드는 수집을 작은 단계로 나눠 실행 사이에 끼워 넣고(단계를 크게 잡으면 전체 멈춤), 세대별 모드의 major 수집은 모든 객체를 도는 전체 멈춤, collectgarbage("count")는 Lua가 쓰는 메모리 총량(KB)

함께 보면 좋은 원인

같은 층: L10 메모리

같은 증상(뚝뚝 끊김)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기