프로그래밍공부(Programming Study)/CS-운영체제(OS)

실제 메모리 문제를 분석하는 흐름

Chann._.y 2026. 4. 10.
728x90

여기까지 오면서 꽤 많은 걸 봤다.

  • malloc이 어떻게 메모리를 가져오는지
  • 내부에서 어떻게 나눠 쓰는지
  • 왜 free해도 RSS가 안 줄어드는지
  • smaps로 메모리를 어떻게 나눠서 보는지
  • eBPF로 어디서 할당되는지 추적하는 방법

이제 남는 건 하나다.

“그래서 실제로 문제 터지면 어떻게 접근해야 하지?”

이건 개념보다 흐름이 중요하다.


대부분의 시작은 여기다

메모리 문제는 보통 이렇게 시작한다.

  • RSS가 계속 증가한다
  • OOM이 난다
  • latency가 갑자기 튄다

여기서 흔히 하는 실수가 있다.

“메모리 누수인가?”

바로 결론부터 내리는 거다.


그런데 실제로는 그 전에 확인해야 할 게 있다.


1단계: “진짜 문제인지”부터 확인한다

처음 해야 할 건 단순하다.

이게 진짜 문제인지 아닌지 구분


예를 들어:

  • RSS 증가 → 무조건 문제 ❌
  • page cache 증가 → 정상일 수도 있음 ⭕

그래서 먼저 보는 건 이거다.

  • RSS
  • 전체 메모리 상황
  • 시스템 pressure

👉 여기서 걸러지는 경우가 꽤 많다.


2단계: 메모리를 “쪼개서” 본다

이제 진짜 분석이다.


여기서 중요한 건 이거다.

RSS 하나만 보면 아무 것도 모른다


그래서 /proc/<pid>/smaps로 내려간다.


그리고 이걸 구분한다.

  • anonymous memory
  • file-backed memory (page cache)
  • mmap 영역

여기서 방향이 갈린다.


경우 1: anon이 증가

→ malloc / heap 문제


경우 2: file 증가

→ page cache (대부분 정상)


경우 3: mmap 증가

→ 큰 메모리 사용 패턴


👉 이 단계에서 문제의 “종류”가 정해진다.


3단계: 증가하는 주체를 찾는다

이제 질문이 바뀐다.

“뭐가 늘고 있는지는 알았는데, 누가 늘리는 거지?”


여기서 eBPF가 들어간다.


하는 일은 단순하다

  • malloc 추적
  • free 추적
  • call stack 수집

즉,

누가 메모리를 만들고 있는지 본다



결과는 보통 이런 식으로 나온다

process_request → malloc
parse_json → malloc
cache_update → malloc

이제 보인다.

“아 여기서 계속 만들고 있네”


4단계: 패턴을 본다

여기서 중요한 건 “한 번”이 아니라 “패턴”이다.


정상

malloc → free → malloc → free

문제

malloc → malloc → malloc → ...
( free 없음 )

또는

작은 malloc 엄청 많이 발생

👉 이건 fragmentation / 성능 문제로 이어진다.


5단계: 실제 원인을 좁힌다

이제 거의 끝이다.


여기까지 오면:

  • 어떤 메모리인지 알고
  • 어디서 발생하는지 알고
  • 어떤 패턴인지 안다

이제 남는 건 코드다.


예를 들어:

  • free 안 하고 있음
  • 캐시가 계속 쌓임
  • 필요 이상으로 크게 할당
  • 반복적으로 작은 할당

👉 이 단계에서 “수정 포인트”가 나온다.


중요한 포인트 하나

이 흐름에서 제일 중요한 건 이거다.


항상 위에서 아래로 내려간다


절대 이렇게 하면 안 된다.

  • 코드부터 보기 ❌
  • 감으로 추측 ❌

👉 대신:

증상 → 종류 → 위치 → 패턴 → 원인

이 순서를 따라간다.


실제로는 이렇게 생각하게 된다

처음에는 이렇게 시작한다.

“왜 RSS 늘지?”


조금 익숙해지면 이렇게 바뀐다.

“anon이야? file이야?”


더 익숙해지면:

“어디서 malloc 터지지?”


마지막에는 이렇게 된다.

“아 이 패턴이면 fragmentation이네”


이게 경험이 쌓이는 과정이다.


여기까지가 한 사이클이다

이 글까지 오면 하나의 흐름이 완성된다.


  • 메모리는 단순 공간이 아니고
  • malloc은 내부적으로 관리되고
  • 성능은 항상 일정하지 않고
  • RSS는 단순 지표가 아니고
  • smaps로 쪼개서 보고
  • eBPF로 원인을 찾는다

👉 이게 한 사이클이다.


한 줄 정리

메모리 문제는 단순히 “많이 쓴다”가 아니라, 어떤 메모리가 어디서 어떻게 생성되고 어떤 패턴으로 유지되는지를 단계적으로 좁혀가면서 분석해야 한다.

728x90

댓글