1. 1GB RAM 서버에서 Nginx, Node.js, MySQL을 동시에 띄우려면
월 몇 천 원짜리 클라우드 서버(1GB RAM)를 사용하다 보면 금방 한계에 부딪힙니다. Nginx, Node.js 앱, MySQL을 모두 올리면 여유 메모리가 거의 없어지고, 어느 순간 서버가 극도로 느려지거나 프로세스가 강제 종료됩니다.
이때 서버 사양을 즉시 업그레이드하기 어렵다면 swap 메모리가 임시 해결책이 될 수 있습니다.
2. swap이란 무엇인가?
swap은 물리적인 RAM이 부족할 때 하드디스크(또는 SSD)의 일부 공간을 메모리처럼 사용하는 기술입니다.
책상(RAM)이 가득 차면 자주 쓰지 않는 물건을 바닥(디스크)에 내려놓는 것과 같습니다. 바닥에서 물건을 집어올리는 것이 책상에서 집어올리는 것보다 훨씬 느리듯, swap은 RAM보다 속도가 훨씬 느립니다.
그럼에도 swap이 있으면 메모리가 완전히 고갈됐을 때 서버가 즉시 죽는 대신, 느리더라도 계속 동작할 수 있습니다.
3. swap을 사용하면 좋은 점과 나쁜 점
좋은 점
메모리 부족으로 인한 갑작스러운 서버 다운을 방지합니다. 저사양 서버에서 여러 서비스를 동시에 올릴 수 있습니다. 추가 비용 없이 설정만으로 즉시 효과를 볼 수 있습니다.
나쁜 점
디스크 I/O는 RAM보다 수십~수백 배 느리기 때문에 swap을 많이 사용하면 서버가 체감상 매우 느려집니다. SSD를 swap으로 많이 사용하면 수명이 단축될 수 있습니다.
swap은 근본 해결책이 아닙니다. 장기적으로는 서버 사양을 업그레이드하는 것이 올바른 방향입니다. swap은 그 전까지의 완충 장치입니다.
4. swap이 필요한 상황 판단하기
아래 상황 중 하나라도 해당되면 swap 설정을 고려합니다.
free -h 명령 실행 시 available 값이 자주 100MB 이하로 떨어집니다. dmesg | grep -i "killed process" 명령에서 OOM Killer가 프로세스를 강제 종료한 기록이 보입니다. 서버가 간헐적으로 응답 없음 상태가 되거나 특정 서비스가 이유 없이 종료됩니다.
반대로 RAM이 넉넉하다면 굳이 swap을 설정할 필요는 없습니다.
5. swap 설정 단계별 가이드
1단계. 현재 swap 상태를 확인합니다.
sudo swapon –show
아무것도 출력되지 않으면 swap이 비활성화 상태입니다.
2단계. swap 파일을 생성합니다.
서버 RAM의 1~2배 크기를 권장합니다. 1GB RAM이라면 1~2GB swap을 만듭니다.
sudo fallocate -l 2G /swapfile
3단계. swap 파일의 접근 권한을 제한합니다.
sudo chmod 600 /swapfile
4단계. swap 형식으로 초기화합니다.
sudo mkswap /swapfile
5단계. swap을 즉시 활성화합니다.
sudo swapon /swapfile
6단계. 재부팅 후에도 자동으로 적용되도록 등록합니다.
sudo nano /etc/fstab
파일 맨 아래에 아래 줄을 추가합니다.
/swapfile none swap sw 0 0
저장 후 free -h를 실행해 Swap 항목에 용량이 표시되면 설정 완료입니다.
6. swappiness – swap을 얼마나 자주 쓸지 조정하기
swappiness는 커널이 얼마나 적극적으로 RAM 대신 swap을 사용할지 결정하는 값입니다. 0에서 100 사이의 숫자이며 기본값은 60입니다.
값이 높을수록 swap을 더 적극적으로 사용하고, 낮을수록 RAM을 최대한 활용한 뒤에만 swap을 사용합니다. 서버 환경에서는 RAM을 최대한 활용하는 것이 좋으므로 10~30 정도의 낮은 값을 권장합니다.
현재 값을 확인합니다.
cat /proc/sys/vm/swappiness
swappiness를 10으로 설정합니다. (재부팅 시 초기화됨)
sudo sysctl vm.swappiness=10
재부팅 후에도 유지하려면 /etc/sysctl.conf 파일을 열어 vm.swappiness=10 줄을 추가합니다.
7. 정리 및 다음 단계
오늘 배운 핵심을 정리합니다.
- swap은 RAM 부족 시 디스크 공간을 임시 메모리로 사용하는 기술입니다.
- RAM보다 훨씬 느리지만 서버 갑작스러운 다운을 막는 완충 역할을 합니다.
- 1GB RAM 이하의 저사양 서버라면 1~2GB swap 설정을 권장합니다.
- swappiness를 낮게 설정하면 RAM을 최대한 활용하고 swap은 최후 수단으로 씁니다.
- swap은 근본 해결책이 아니므로 장기적으로는 서버 업그레이드가 필요합니다.
다음 글에서는 Nginx 리버스 프록시 설정으로 포트 번호 없이 도메인만으로 서비스에 접속하는 방법을 알아보겠습니다.