물리 메모리가 부족하면 디스크의 스왑 공간을 가상 메모리 확장으로 사용합니다. 스왑이 너무 많이 쓰이면 성능이 급격히 저하되므로, 적절한 튜닝이 필요합니다.


스왑이란

디스크 공간을 메모리 확장으로 사용하는 메커니즘 입니다. 물리 메모리가 부족할 때 사용 빈도가 낮은 메모리 페이지를 디스크로 내보내고(swap out), 필요할 때 다시 읽어옵니다(swap in).

PLAINTEXT
물리 메모리 (빠름)        스왑 공간 (느림)
┌───────────────┐      ┌──────────────┐
│ 활성 페이지     │      │ 비활성 페이지   │
│ (자주 사용)     │  ←→  │ (디스크에 저장)  │
│               │      │              │
└───────────────┘      └──────────────┘
   ~100ns 접근            ~10ms 접근 (HDD)
                          ~0.1ms (SSD)

스왑 설정

스왑 파티션 vs 스왑 파일

항목스왑 파티션스왑 파일
설정파티션 생성 필요파일 생성으로 간단
크기 변경재파티셔닝 필요파일 크기 변경으로 유연
성능약간 더 좋음거의 동일 (현대 커널)
관리복잡쉬움
BASH
# 현재 스왑 확인
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).

BASH
# 현재 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 (기본)균형 잡힌 사용

스왑과 성능

스왑 사용이 증가하면 성능이 급격히 저하됩니다.

BASH
# 스왑 사용 현황
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를 용도에 맞게 튜닝하고, 스왑 사용량을 모니터링하여 메모리 부족을 조기에 감지하는 것이 중요합니다.

댓글 로딩 중...