21. 메모리 사용량 진단: RSS와 힙 사용량의 괴리, 할당자 반환 정책, 누수 vs 단편화

난이도 상 해설 보기 →
문제

문제 21 — 메모리 사용량 진단: RSS와 힙 사용량의 괴리, 할당자 반환 정책, 누수 vs 단편화

장기간 무중단으로 도는 게임 서버 프로세스의 메모리 사용량(RSS)이 계속 증가한다는 알림을 받았다. 그런데 애플리케이션이 추적하는 "살아 있는 객체의 총 바이트 수"는 일정하다.

다음을 설명하시오.

  1. RSS 가 무엇을 세는가 가상 메모리 크기(VSZ), RSS, PSS, 그리고 애플리케이션이 계산한 힙 사용량이 각각 무엇을 의미하며 왜 서로 다른 값이 나오는지 설명하시오. 공유 라이브러리, 페이지 캐시, 스택, 커밋되었지만 접근되지 않은 페이지가 각 수치에 어떻게 반영되는가?

  2. 누수(leak)와 단편화(fragmentation)의 구분 두 현상이 각각 어떤 메커니즘으로 RSS 를 늘리는지 설명하고, 관측 지표만으로 둘을 구분하는 방법을 제시하시오. "살아 있는 객체 총량은 일정한데 RSS 만 증가"는 어느 쪽을 시사하는가?

  3. 할당자가 OS 에 메모리를 돌려주지 않는 이유 free()/delete 를 호출해도 RSS 가 줄지 않는 경우가 많다. glibc malloc 이 brk 로 늘린 힙 상단과 mmap 으로 얻은 영역을 각각 어떻게 다루는지, M_TRIM_THRESHOLD/M_MMAP_THRESHOLD 와 malloc_trim() 이 무엇을 하는지 설명하시오. jemalloc/tcmalloc 의 decay 기반 반환 정책이 glibc 와 어떻게 다른지도 비교하시오.

  4. 관리 언어(C#)의 경우 .NET 프로세스에서 "GC 힙 크기"와 "프로세스 RSS"가 크게 벌어지는 이유를 설명하시오. 다음을 각각 다루시오.

    • LOH(대형 객체 힙)의 단편화와 압축 설정
    • Server GC 의 코어별 힙과 세그먼트 반환 정책
    • 네이티브 메모리(핀 고정 버퍼, 소켓 버퍼, 네이티브 라이브러리) 누수
    • GC 힙은 작은데 RSS 가 큰 상황에서 무엇을 의심해야 하는가
  5. 진단 도구와 절차 다음 상황에서 어떤 도구를 어떤 순서로 쓸 것인지, 각 도구가 무엇을 알려주고 무엇을 알려주지 못하는지 설명하시오.

    • C++ 서버: ASAN/LSAN, valgrind massif, heaptrack, jemalloc 의 프로파일링 기능
    • C# 서버: dotnet-counters, dotnet-gcdump, dotnet-dump + SOS, ETW/EventPipe
    • 운영 중인 프로덕션 서버에 적용할 때의 제약(오버헤드, 정지 시간)과 대안
  6. 설계 차원의 예방 장기 실행 게임 서버에서 단편화를 구조적으로 줄이는 방법을 제시하고 각각의 트레이드오프를 설명하시오. (크기 클래스별 오브젝트 풀, 아레나/리전 할당자, 슬랩 할당, 고정 크기 버퍼 풀, 주기적 프로세스 재시작(rolling restart) 등)

답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.