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

게임 렉 백서 › L10 메모리

메모리 누수 Memory leak

원인 ID mem-leak · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라

그림과 실험이 있는 원본 카드로 열기 →

해제되지 않는 메모리가 조금씩 쌓이면 며칠 뒤 GC 폭주·스왑·강제 종료가 일어납니다.

왜 접속 종료한 캐릭터 정보·이벤트 핸들러가 해제되지 않음 → 그러면 며칠에 걸쳐 여유 메모리가 줄어듦 → 화면에서는 점검 직후엔 멀쩡, 날이 갈수록 렉, 결국 서버 다운

증상
슬로우모션, 멈춤, 접속 끊김
요인
정체
누가 겪나
서버 전체
언제
오래 켜 둘수록, 저녁 피크 시간
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라
게임개발팀 할 일
힙 덤프 분석, 장시간 부하 테스트.
인프라팀 할 일
프로세스별 메모리 사용량 추세 모니터링과 경보.
그래프에서는
서서히 오름 · 프로세스 메모리(RSS), GC 직후 힙
확인할 곳
게임 서버 프로세스의 메모리(pidstat -r의 RSS)를 며칠 단위로 보고, GC를 쓰는 서버는 GC 직후 남은 힙을 봄. Java는 -Xlog:gc 줄에 나오는 GC 전·후 사용량 가운데 GC 후 값, .NET은 dotnet-counters의 GC 뒤 힙 크기(.NET 9 이후 dotnet.gc.last_collection.heap.size, 8 이하 GC Heap Size)
이러면 맞음
GC 직후 남은 힙(바닥선)이 재시작 뒤 날마다 올라가고 인원이 적은 새벽에도 내려오지 않음
이러면 아님
힙 바닥선은 평평한데 RSS만 오르면 단편화(mem-fragment)나 네이티브 메모리 쪽. 인원을 따라 오르내리면 정상 사용량
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
정기 점검으로 매주 재시작하면 누수가 가려져 오래 발견되지 않습니다. 점검이 한 번 미뤄지거나 이벤트로 인원이 늘었을 때 갑자기 드러나는 경우가 많습니다.

출처

  1. Troubleshoot Memory Leaks Oracle
    실행이 점점 느려지면 누수를 의심, 결국 메모리가 바닥나 비정상 종료. 누수 분석의 핵심 자료는 힙 덤프
  2. Debug a memory leak in .NET .NET
    GC가 있어도 필요 없는 객체를 계속 참조하면 누수, 성능 저하와 OutOfMemoryException. 메모리 추세 확인과 덤프 분석
  3. Garbage Collector Implementation Oracle
    -Xlog:gc 줄은 “GC 전 사용량->GC 후 사용량(힙 크기)” 형식
  4. dotnet-counters diagnostic tool .NET
    .NET 9 이후는 dotnet.gc.last_collection.heap.size, .NET 8 이하는 GC Heap Size로 표시
  5. pidstat(1) — Linux manual page sysstat
    -r: 프로세스별 RSS(실제 램에 올라 있는 메모리)와 페이지 폴트

함께 보면 좋은 원인

같은 층: L10 메모리

같은 증상(슬로우모션)의 다른 층 원인

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