한국어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)로 분당 GC 횟수를 세고 .NET은 dotnet-counters의 할당량과 GC 횟수(.NET 9 이후 dotnet.gc.heap.total_allocated·dotnet.gc.collections, 8 이하 Allocation Rate·Gen 0 GC Count)를 봄. 동시 접속 수·이벤트 시각과 겹쳐 봄
이러면 맞음
이벤트가 시작되면 할당 속도와 GC 횟수가 인원 증가보다 가파르게 늘고 짧은 멈춤이 잦아짐. 이벤트가 끝나면 원래대로 돌아옴
이러면 아님
GC 횟수는 그대로인데 한 번의 멈춤이 길어지면 살아 있는 데이터가 늘어난 것(mem-gc-thrash, mem-leak)
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. Garbage Collector Implementation Oracle
    Young 영역이 차면 minor GC, 살아남은 객체 일부가 Old 영역으로 옮겨지고 Old가 차면 힙 전체를 수집(minor보다 훨씬 오래 걸림), -Xlog:gc는 GC마다 한 줄씩 기록
  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 메모리

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

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