여기까지 오면서 꽤 많은 걸 봤다.
- 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로 원인을 찾는다
👉 이게 한 사이클이다.
한 줄 정리
메모리 문제는 단순히 “많이 쓴다”가 아니라, 어떤 메모리가 어디서 어떻게 생성되고 어떤 패턴으로 유지되는지를 단계적으로 좁혀가면서 분석해야 한다.
'프로그래밍공부(Programming Study) > CS-운영체제(OS)' 카테고리의 다른 글
| eBPF hook 종류 (kprobe, tracepoint, uprobe) (0) | 2026.04.09 |
|---|---|
| eBPF는 내부적으로 어떻게 동작할까 (0) | 2026.04.08 |
| eBPF는 왜 안전한가 (그리고 언제 위험한가) (0) | 2026.04.07 |
| eBPF로 메모리를 추적하는 방법 (0) | 2026.04.06 |
| /proc/smaps로 메모리를 제대로 분석하는 방법 (0) | 2026.04.05 |
댓글