Linux 메모리 관리 핵심 정리
1. free 명령 구조
total used free buff/cache available
Mem: 7.9G 2.1G 1.2G 4.6G 5.4G
항목 내용
| used | 프로세스 메모리 + SUnreclaim(Slab) |
| buff/cache | Buffers + Cached(page cache) + SReclaimable(Slab) |
| available | 실제 사용 가능한 메모리 (free + 회수 가능한 buff/cache) |
2. buff/cache 세부 구성
항목 역할
| Buffers | 블록 디바이스의 메타데이터 캐시 (슈퍼블록, inode 테이블 등) |
| Cached | 한 번 읽은 파일 내용을 보관하는 page cache |
| SReclaimable | 해제 가능한 Slab 캐시 (dentry, inode cache 등) |
공통 특성: 미사용 메모리를 커널이 효율성을 위해 활용하며, 프로세스가 필요로 하면 즉시 해제하여 양보
3. /proc/meminfo — Anon / File 영역
항목 내용
| Active(anon) / Inactive(anon) | 프로세스의 힙, 스택 등 파일과 무관한 메모리 |
| Active(file) / Inactive(file) | page cache, mmap된 파일 등 I/O 캐시 |
LRU 관리 방식
Active ↔ Inactive 이동 → 접근 여부에 따라 상시 발생
Inactive → 해제(reclaim) → 메모리 압박 시에만 발생
4. Slab 메모리
커널 내부 객체(dentry, inode, task_struct 등)를 위한 커널 전용 메모리 풀
항목 내용 free 위치
| SReclaimable | dentry/inode cache 등 해제 가능 | buff/cache |
| SUnreclaim | task_struct, kmalloc 등 해제 불가 | used |
# Slab 상세 확인
grep -E "Slab|SReclaimable|SUnreclaim" /proc/meminfo
sudo slabtop -o
5. 메모리 이슈 진단 흐름
메모리 사용량 높음
│
▼
free -h
│
├── buff/cache 높다
│ └── page cache 과다 → echo 1 > /proc/sys/vm/drop_caches
│
└── used 높다
│
├── 프로세스 문제 → top / ps 로 범인 찾기
│
└── Slab 문제 → /proc/meminfo 확인
│
├── SReclaimable 높다
│ → echo 2 > drop_caches (응급처치)
│
└── SUnreclaim 높다
→ slabtop 으로 원인 캐시 특정
→ 해당 프로세스 조치
6. drop_caches 정리
# 권한 문제로 아래처럼 실행해야 함 (sudo만으론 리다이렉트 불가)
sudo sh -c 'echo N > /proc/sys/vm/drop_caches'
# 또는
echo N | sudo tee /proc/sys/vm/drop_caches
값 동작
| 1 | page cache 해제 |
| 2 | dentry + inode cache 해제 (SReclaimable) |
| 3 | 1 + 2 모두 해제 |
⚠️ SUnreclaim은 drop_caches로 해제 불가 — 해당 프로세스 조치 필요
⚠️ 운영 환경에서 남발 시 캐시 해제 후 디스크 I/O 급증 주의