서버 메모리가 갑자기 100%에 도달하면서 MySQL이나 PHP-FPM 프로세스가 무응답으로 종료되는 현상을 경험해봤을 것이다.
로그 파일에도 특별한 에러 메시지 없이 서비스가 그냥 죽어버려 당황했던 적이 많다.
다만 대부분의 개발자들은 정확한 원인이 리눅스 커널의 OOM Killer 작동 때문이라는 점과 이를 방지하는 Swap 메모리 설정법을 잘 모른다.
이번에는 OOM Killer가 정확히 뭔지, 왜 Swap 메모리가 필요한지, 그리고 최적의 swappiness 값으로 서버를 안정화하는 방법을 완벽하게 정리해서 소개하겠다.

 

1. OOM Killer 동작 원리와 Swap 메모리의 이해

리눅스 커널은 시스템 메모리가 극한으로 부족해지면 Out of Memory(OOM) Killer라는 비상 메커니즘을 작동시킨다.
우선순위 점수(oom_score)가 가장 높은 프로세스를 강제로 종료(SIGKILL)하여 전체 시스템이 멈추는 비상 사태를 막는다.
이때 주로 가장 많은 메모리를 점유하던 MySQL(mysqld)이나 Nginx/PHP-FPM worker 프로세스가 희생양이 된다.

Swap 메모리는 물리적 RAM이 부족할 때 디스크 공간의 일부를 가상 메모리로 할당해 사용하는 기술이다.
RAM 속도보다 디스크 I/O 속도가 느리지만, 갑작스러운 메모리 스파이크 시 프로세스가 강제 종료되는 최악의 상황을 방지한다.

구분물리 RAMSwap 메모리OOM Killer 발동
속도매우 빠름(ns 단위)상대적으로 느림(ms 단위)프로세스 종료로 즉시 확보
역할주요 프로그램 주소 공간RAM overflow 방지용 튜브시스템 다운 방지 비상조치
권장 비중100% 사용RAM의 1~2배 권장발동 전 미리 예방 필요

 

2. Swap 메모리 파일 생성 및 활성화 4단계

AWS EC2 t3.micro나 Naver Cloud micro 등 1GB~2GB 내외의 프리티어 인스턴스는 Swap이 기본 해제되어 있는 경우가 많다.
터미널 명령어를 통해 2GB 크기의 스왑 파일을 생성하고 등록하는 표준 과정이다.

 

스왑 파일 생성 및 권한 설정

fallocate 명령어로 빠르게 2GB 공간을 확보하고, 보안을 위해 root 사용자만 접근하도록 권한을 600으로 제한한다.

# 1. 2GB 크기의 스왑 파일 생성
sudo fallocate -l 2G /swapfile

# fallocate 지원이 안 될 경우 dd 명령어 대체 사용
# sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

# 2. 보안 권한 설정 (루트 외 읽기/쓰기 차단)
sudo chmod 600 /swapfile

# 3. 파일 영역을 스왑 공간으로 변환
sudo mkswap /swapfile

# 4. 스왑 공간 활성화
sudo swapon /swapfile

 

3. 실전 예제: swappiness 설정 및 재부팅 자동 마운트

스왑 파일 생성이 끝났다면 두 가지 추가 작업이 필요하다.
서버가 재부팅되어도 스왑이 유지되도록 /etc/fstab에 등록하고, 커널이 스왑을 얼마나 적극적으로 사용할지 결정하는 swappiness 수치를 조정해야 한다.

✗ 잘못된 방식 (임시 설정 및 swappiness 미조정)
# 재부팅 시 스왑이 해제되고 swappiness 기본값(60) 유지 시 디스크 병목 발생
sudo swapon /swapfile
# 시스템 재부팅 후 swapon -s 로 확인 시 스왑 목록이 비어있음
✓ 올바른 방식 (영구 반영 및 커널 파라미터 최적화)
# 1. /etc/fstab 등록하여 재부팅 후 자동 마운트
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

# 2. swappiness 수치를 10으로 변경 (RAM 우선 사용, 부족 시 스왑 사용)
sudo sysctl vm.swappiness=10

# 3. sysctl.conf 파일에 영구 보관
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

출력 결과 확인:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          983Mi       450Mi       120Mi       2.0Mi       413Mi       380Mi
Swap:         2.0Gi        12Mi       2.0Gi

 

4. 실무에서 흔히 하는 실수와 주의사항

스왑 메모리를 설정할 때 가장 자주 범하는 실수들을 정리했다.
디스크 성능 차이와 스왑 스래싱(Swap Thrashing) 현상을 이해하지 못하면 서버가 더 느려질 수 있다.

✗ 잘못된 방식: RAM 크기의 4~5배 이상 과도한 스왑 할당.
스왑이 너무 크면 RAM 부족 시 디스크 읽기/쓰기가 폭주하면서 디스크 I/O 병목으로 서버 전체가 먹통이 되는 스래싱 현상이 발생한다.

✓ 올바른 방식: RAM 2GB 이하에서는 RAM 크기의 1~2배(2GB~4GB) 할당 후 swappiness 수치를 10~20 수준으로 낮게 유지.
스왑은 어디까지나 OOM 방지용 비상 튜브 역할을 해야 하며, 실시간 서비스 메모리 부족의 근본 해결책은 RAM 증설이다.

 

5. 정리 및 다음 단계

Linux Swap 메모리 설정과 swappiness 최적화는 소형 클라우드 서버 운영의 필수 안전장치다.
작은 스왑 용량 할당과 커널 속성 변경이라는 습관이 모여서 서버 다운타임을 제로로 만드는 큰 효과를 만든다.
이 글의 2단계와 3단계 명령어를 그대로 참고해 실행 중인 인스턴스에 스왑을 구성하면, OOM Killer로 인한 데이터베이스 갑작스러운 다운 현상을 완전히 방지하는 최종 결과를 얻을 수 있을 것이다.