
AWS EC2 프리티어 인스턴스 유형인 t2.micro는 위처럼 1GB의 메모리만을 지원하고 있기 때문에 Jenkins 등 서버에서 무거운 CI/CD 작업을 할 때 서버에 메모리가 부족해 Cannot allocate memory 문제가 생길 수 있다.
리눅스는 물리적인 메모리(RAM)가 부족하면 일부 데이터를 디스크의 스왑 공간(Swap Space)으로 옮겨 활용할 수 있다.
이때, 스왑 공간은 디스크에 생성된 특수한 영역으로, RAM처럼 사용된다.
| 비교 항목 | RAM | HDD | SSD |
|---|---|---|---|
| 저장 방식 | 전기 신호 | 자기 디스크(기계식) | NAND 플래시 메모리(반도체) |
| 속도 (읽기/쓰기) | 10~50GB/s | 100~200MB/s | 500MB~7GB/s (NVMe 기준) |
| 지연 시간 (Latency) | 10~100ns (나노초) | 5~10ms (밀리초) | 50~100µs (마이크로초) |
| 휘발성 여부 | 휘발성 | 비휘발성 | 비휘발성 |
하지만 swap 메모리는 HDD/SSD를 사용해 CPU가 데이터를 읽어들일 때 SATA, NVMe 같은 버스를 거쳐야 하기 때문에 cache를 사용하며 CPU와 직접 연결된 RAM 메모리보단 상대적으로 성능이 떨어진다.
리눅스에서 스왑을 만들 때, 전용 파티션(Swap Partition)을 만들어 swap메모리를 사용하는 방법과
파일을 사용해서 스왑(Swap File)을 설정하는 방법이 있다.
| 항목 | Swap Partition | Swap File |
|---|---|---|
| 설정 방식 | 별도의 디스크 파티션을 생성해야 함 | 일반 파일을 생성하여 사용 |
| 유연성 | 크기 변경이 어려움 (파티션 변경 필요) | 필요할 때 추가/삭제 가능 |
| 설정 복잡도 | 초기 설정이 필요 (디스크 재구성) | 간단한 명령어로 생성 가능 |
| 성능 | 파일보다 약간 빠름 (고정된 영역 사용) | 일반적으로 충분히 빠름 (커널 최적화) |
| 가상 머신 환경 | 파티션 추가가 어려움 | 손쉽게 설정 가능 |
| SSD 수명 영향 | 일정 영역을 계속 사용 | 필요할 때만 사용 가능 |
두 가지 방법 중 EC2 인스턴스의 swap 메모리를 만들 때는 주로 Swap File을 사용하는데, 그 이유는 다음과 같다.
기존에 swap 메모리를 만든 이후 메모리가 부족한 경우, 새롭게 스왑 파일을 만들어 추가할 수 있다.
스왑 파티션은 디스크 공간을 고정적으로 할당하기 때문에, 나중에 파티션을 수정하려면 디스크를 재구성하는 복잡한 과정이 필요 하지만, 스왑 파일은 그냥 파일을 생성하고 추가하면 되므로 훨씬 유연하다.
가상 머신(VM) 또는 클라우드 환경(AWS, Azure, GCP)에서는 스왑 파티션을 설정하기 어려운 경우가 많다.
스왑 파일을 사용하면 시스템 운영 중에도 스왑 공간을 조정할 수 있어 유동적인 관리가 가능하다.
과거 리눅스에서는
초기 리눅스 파일 시스템(ext2, ext3 등)은 랜덤 읽기/쓰기 속도가 느렸고,
HDD를 주로 사용했기 때문에 파일 시스템 오버헤드 문제, 디스크 단편화 문제가 있었고
리눅스 커널이 스왑 파일을 효과적으로 관리하는 기능이 부족해 스왑 파일보다 스왑 파티션이 성능과 안정성 면에서 선호되었지만,
현재는
최신 파일 시스템(ext4, XFS, Btrfs 등)의 성능 개선되었고
SSD 사용, 리눅스 커널(3.x, 4.x, 5.x 이후)에서는 커널이 스왑 파일을 직접 관리하며 단편화 문제 부담이 적어졌으며
디스크의 특정 블록만 반복적으로 쓰게 되는 파티션 방식의 불균형 마모 문제 개선과 TRIM과 호환이 잘 되어 SSD 수명 관리 관점에서도 스왑 파일 방식이 선호되고 있다.
가상 메모리(Virtual Memory)를 사용하며, 메모리를 페이지(Page) 단위로 관리한다리눅스 커널은 메모리를 4KB 같은 작은 단위(페이지)로 쪼개어 관리한다.
즉, 일부 페이지는 RAM에 있고, 일부 페이지는 스왑 공간(디스크)에 저장할 수 있다.
메모리가 부족하면, 사용하지 않는 페이지를 디스크로 옮겨 스왑 공간에 저장해두고 나중에 해당 페이지가 필요할 때 RAM으로 불러와 사용한다.
블록 디바이스(Block Device)는 기본적으로 디스크의 저장 단위이며 물리적 공간이다.
Swap Partition은 특정 블록 디바이스를 직접 사용한다.
Swap File은 mkswap 명령으로 스왑 공간으로 변환하는 과정에서 스왑 파일이 저장된 디스크 블록 정보가 커널에 등록된다.
등록된 스왑 파일은 커널이 직접 해당 디스크 블록을 관리하기 때문에 (파일 시스템을 거쳐야 하는) 일반 파일과 달리 빠르게 접근하게 되어 블록 디바이스 처럼 처리된다.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
600 (rw- --- ---)
sudo mkswap /swapfile
sudo swapon /swapfile
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
등록된 swap파일 목록 출력
swapon -s
리눅스 os 메모리 확인하기
free -h
swap 활성화 해제
swapoff /swapfile
# 현재 사용 중인 메모리가 부족하여 swap을 비활성화할 수 없을 때
# swapoff failed: Cannot allocate memory 오류가 발생할 수 있음
# 해결 : 새로운 SwapFile을 추가 한 뒤 해제
리눅스에서는 여러 개의 Swap File 또는 swap 파티션을 사용할 때,
우선순위(Priority)를 설정하여 특정 swap 공간을 먼저 사용하도록 할 수 있다.
우선순위가 높은 swap 공간이 먼저 사용되며, 그 공간이 가득 차면 우선순위가 낮은 swap으로 넘어간다.
sudo swapon -p 10 /swapfile1 # /swapfile1의 우선순위를 10으로 설정
sudo swapon -p 5 /swapfile2 # /swapfile2의 우선순위를 5로 설정