리눅스에서 스왑 메모리 관리하기
가상서버로 이사한 이후 메모리가 너무 적은지 계속 메모리 관련 에러가 난다.
passenger 모듈 설치에도 메모리 에러 때문에 잘 안 되었었는데 redmine + git을 사용하려고 하니 또 메모리가 너무 적다고 한다. 아무래도 스왑 메모리를 2기가 정도 지정해놓고 계속 써야 할 모양.
2026년 수정 안내 원래 이 글에는 두 가지 문제가 있었다.
/etc/fstabs라고 잘못 적어 그대로 따라 하면 부팅 시 적용되지 않았고,chmod 600단계가 빠져 있어 요즘swapon에서는 경고가 나거나 거부된다. 바로잡는다.
1. 스왑 파일 생성
dd if=/dev/zero of=/swapfile bs=1M count=2048
2GiB짜리 파일을 만든다. fallocate -l 2G /swapfile을 쓰면 훨씬 빠르다 — fallocate는 디스크 블록을 실제로 미리 확보해두는 방식이라(희소 파일을 만드는 truncate와는 반대), ext4/XFS에서는 이 방식이 권장된다. 다만 Btrfs에서는 CoW(Copy-on-Write) 특성 때문에 fallocate로 만든 스왑 파일이 제대로 동작하지 않는 경우가 있다. Btrfs를 쓴다면 아래 “알아둘 점”의 chattr +C 안내를 참고하고, 그래도 불안하다면 dd로 만드는 편이 확실하다.
2. 권한 설정 (빠뜨리면 안 된다)
chmod 600 /swapfile
스왑 파일에는 메모리에 있던 내용이 그대로 들어간다. 다른 사용자가 읽을 수 있으면 그 자체가 정보 유출이다. 그래서 요즘 swapon은 권한이 열려 있으면 다음과 같이 경고하거나 아예 거부한다.
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
3. 스왑 영역으로 포맷
mkswap /swapfile
4. 활성화
swapon /swapfile
확인:
swapon --show
free -h
5. 부팅 시 자동 마운트
/etc/fstab에 다음 줄을 추가한다. fstabs가 아니라 fstab이다.
/swapfile none swap defaults 0 0
추가한 뒤 문법이 맞는지 먼저 확인하는 것이 안전하다. fstab에 오타가 있으면 부팅이 실패할 수 있다.
swapoff /swapfile
mount -a # 오류 없이 통과하는지 확인
swapon -a # fstab을 읽어 스왑을 켠다
swapon --show
swappiness 조정
스왑을 얼마나 적극적으로 쓸지는 vm.swappiness로 정한다. 기본값은 60이다.
sysctl vm.swappiness=10
영구 적용하려면:
# /etc/sysctl.d/99-swap.conf
vm.swappiness = 10
- DB 서버라면 1~10 정도로 낮춘다. 스왑으로 밀려나면 응답 시간이 급격히 나빠진다.
- 메모리가 정말 부족해 OOM Killer가 도는 상황이라면 기본값을 그대로 두는 편이 낫다.
알아둘 점
- 스왑은 메모리 부족의 해결책이 아니라 완충 장치다. 디스크는 램보다 수백 배 느리므로, 스왑을 실제로 많이 쓰기 시작하면 서버가 사실상 멈춘 것처럼 느려진다. 근본 해결은 메모리 증설이나 사용량 최적화다.
- 컨테이너 안에서는 스왑을 이 방식으로 만들 수 없다. 호스트에서 설정해야 한다.
- btrfs에서는 스왑 파일에 추가 제약이 있다.
chattr +C로 CoW를 끈 디렉터리에 만들어야 한다.
댓글 남기기