앞 글에서 free를 해도 RSS가 줄어들지 않는 이유를 봤다.
핵심은 이거였다.
- free는 OS에 반환이 아니라 재사용 표시다
- RSS에는 여러 종류의 메모리가 섞여 있다
여기까지 이해하면 자연스럽게 이런 생각이 든다.
“그럼 지금 보이는 메모리가 진짜 문제인지 어떻게 판단하지?”
이걸 하려면 결국 한 번은 /proc으로 내려가야 한다.
왜 top이나 htop만 보면 부족할까
보통 메모리 문제를 처음 보면 이렇게 본다.
- top
- htop
- ps
여기서 RSS를 보고 판단한다.
그런데 여기서 한 번씩 막힌다.
RSS는 늘어나는데, 원인이 뭔지 모르겠다
이유는 단순하다.
RSS는 결과만 보여주고, 구성은 안 보여준다
예를 들어 RSS가 1GB라고 해도:
- 1GB가 전부 malloc일 수도 있고
- 절반은 page cache일 수도 있고
- mmap 파일일 수도 있다
👉 즉, RSS 하나만으로는 판단이 안 된다.
그래서 /proc//smaps를 본다
리눅스에서는 각 프로세스의 메모리 상태를 자세하게 볼 수 있다.
/proc/<pid>/smaps
이 파일을 보면 메모리가 “구간별”로 나눠져 있다.
대략 이런 식이다
00400000-00452000 r-xp ...
Size: 328 kB
Rss: 200 kB
Pss: 100 kB
Shared_Clean: 50 kB
Private_Dirty: 150 kB
...
처음 보면 좀 복잡해 보이는데,
실제로 중요한 건 몇 개 안 된다.
제일 먼저 보는 건 이거다
1. Rss
실제 물리 메모리에 올라온 양
2. Pss
공유 메모리를 나눠서 계산한 값
👉 여러 프로세스가 같은 라이브러리를 쓰는 경우:
- RSS는 중복됨
- PSS는 나눠짐
그래서 실제 사용량을 보려면 PSS가 더 정확하다.
3. Private vs Shared
이건 꽤 중요하다.
- Private → 이 프로세스만 사용하는 메모리
- Shared → 다른 프로세스와 공유
특히 중요한 건:
- Private_Dirty → 진짜 내가 쓰고 있는 메모리
👉 이게 늘어나면 진짜 문제일 가능성이 높다.
이걸 어떻게 해석해야 할까
이제 핵심은 이거다.
숫자를 보는 게 아니라 “성격”을 구분해야 한다
1. anonymous memory인지 확인
특징:
- heap, stack
- malloc으로 생성
smaps에서는 보통:
- [heap]
- [stack]
같은 이름으로 나온다.
👉 이게 계속 증가한다면
메모리 사용 증가 또는 누수 가능성
2. file-backed memory (page cache)
특징:
- 파일에서 읽은 데이터
- 공유 가능
smaps에서는:
- 파일 경로로 표시됨
👉 이게 증가하는 경우
I/O 캐시일 가능성이 높다 (정상일 수 있음)
3. mmap 영역
특징:
- 큰 메모리
- 라이브러리
- 파일 매핑
👉 이게 많다면
- large allocation
- 또는 파일 기반 처리
실제로는 이렇게 본다
상황 1
- RSS 증가
- anon 증가
👉 메모리 사용 증가 or 누수 의심
상황 2
- RSS 증가
- file 증가
👉 page cache 증가 (정상일 가능성 높음)
상황 3
- RSS 증가
- mmap 증가
👉 큰 메모리 사용 패턴
중요한 포인트 하나
많이 하는 실수다.
❌ RSS 증가 = 메모리 누수
✅ 정확한 해석
RSS는 여러 종류가 섞여 있기 때문에, 반드시 나눠서 봐야 한다
그래서 실제 분석 흐름은 이렇다
1. RSS 확인
2. smaps 열기
3. anon / file / mmap 구분
4. 증가하는 영역 찾기
5. 원인 추적
여기까지 이해하면 달라지는 것
1. “감”이 아니라 “근거”로 판단하게 된다
2. 메모리 누수인지 아닌지 구분 가능
3. page cache를 쓸데없이 의심하지 않게 된다
다음으로 이어지는 질문
여기까지 오면 이런 생각이 든다.
“이걸 매번 손으로 봐야 하나?”
“자동으로 추적할 수는 없나?”
이게 바로 다음 단계다.
'프로그래밍공부(Programming Study) > CS-운영체제(OS)' 카테고리의 다른 글
| eBPF는 왜 안전한가 (그리고 언제 위험한가) (0) | 2026.04.07 |
|---|---|
| eBPF로 메모리를 추적하는 방법 (0) | 2026.04.06 |
| free를 했는데 왜 RSS는 줄어들지 않을까 (0) | 2026.04.04 |
| O(1)인데 왜 느려질까 (메모리 성능의 진짜 문제) (0) | 2026.04.03 |
| malloc은 내부에서 어떻게 메모리를 관리할까 (1) | 2026.04.02 |
댓글