Swap — 스왑 공간 관리와 swappiness 튜닝
물리 메모리가 부족하면 디스크의 스왑 공간을 가상 메모리 확장으로 사용합니다. 스왑이 너무 많이 쓰이면 성능이 급격히 저하되므로, 적절한 튜닝이 필요합니다.
스왑이란
디스크 공간을 메모리 확장으로 사용하는 메커니즘 입니다. 물리 메모리가 부족할 때 사용 빈도가 낮은 메모리 페이지를 디스크로 내보내고(swap out), 필요할 때 다시 읽어옵니다(swap in).
물리 메모리 (빠름) 스왑 공간 (느림)
┌───────────────┐ ┌──────────────┐
│ 활성 페이지 │ │ 비활성 페이지 │
│ (자주 사용) │ ←→ │ (디스크에 저장) │
│ │ │ │
└───────────────┘ └──────────────┘
~100ns 접근 ~10ms 접근 (HDD)
~0.1ms (SSD)
스왑 설정
스왑 파티션 vs 스왑 파일
| 항목 | 스왑 파티션 | 스왑 파일 |
|---|---|---|
| 설정 | 파티션 생성 필요 | 파일 생성으로 간단 |
| 크기 변경 | 재파티셔닝 필요 | 파일 크기 변경으로 유연 |
| 성능 | 약간 더 좋음 | 거의 동일 (현대 커널) |
| 관리 | 복잡 | 쉬움 |
# 현재 스왑 확인
swapon --show
free -h
# 스왑 파일 생성
sudo fallocate -l 4G /swapfile # 4GB 파일 생성
sudo chmod 600 /swapfile # 권한 설정
sudo mkswap /swapfile # 스왑 포맷
sudo swapon /swapfile # 스왑 활성화
# 부팅 시 자동 마운트 (/etc/fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 스왑 비활성화
sudo swapoff /swapfile
swappiness
커널이 스왑을 얼마나 적극적으로 사용할지 결정하는 파라미터입니다 (0~200, 기본값 60).
# 현재 swappiness 확인
cat /proc/sys/vm/swappiness
# 임시 변경
sudo sysctl vm.swappiness=10
# 영구 변경 (/etc/sysctl.conf)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
| 값 | 동작 |
|---|---|
| 0 | 가능한 스왑 안 함 (OOM 직전에만) |
| 10~30 | 스왑 최소화 — DB 서버 권장 |
| 60 | 기본값 — 균형 |
| 100 | 적극적으로 스왑 사용 |
용도별 권장값
| 서버 유형 | swappiness | 이유 |
|---|---|---|
| 데이터베이스 | 1~10 | 자체 캐시가 중요, 스왑은 성능 저하 |
| 웹 서버 | 10~30 | 응답 지연 최소화 |
| 일반 데스크탑 | 60 (기본) | 균형 잡힌 사용 |
스왑과 성능
스왑 사용이 증가하면 성능이 급격히 저하됩니다.
# 스왑 사용 현황
vmstat 1
# si (swap in), so (swap out) 컬럼 확인
# si, so가 지속적으로 높으면 스래싱 위험
# 프로세스별 스왑 사용량
for pid in /proc/[0-9]*/status; do
grep -H VmSwap "$pid" 2>/dev/null | grep -v "0 kB"
done
핵심 포인트
- 스왑 = 성능 저하 신호: 스왑 사용이 지속적이면 메모리 부족, 근본적 해결 필요
- DB 서버에서 swappiness를 낮추는 이유: DB의 버퍼 풀이 스왑되면 쿼리 성능 급격히 저하
- 스왑을 0으로 하면 안 되는 이유: 비활성 메모리까지 물리 메모리에 유지 → OOM Killer 더 빨리 발동
정리
스왑은 메모리 부족 시 안전망이지만, 의존해서는 안 됩니다. swappiness를 용도에 맞게 튜닝하고, 스왑 사용량을 모니터링하여 메모리 부족을 조기에 감지하는 것이 중요합니다.