스왑 메모리는 물리 메모리 용량이 부족할 때 사용되는 가상 메모리 영역입니다. 고사양 작업 중 메모리가 부족해서 컴퓨터가 자주 멈춘다면 스왑 메모리를 늘려보는 것도 하나의 방법입니다. 이 글은 Ubuntu에서 스왑 메모리를 file로 설정하고, 나의 환경에 맞게 조정하기 위해 모니터링 하는 방법을 설명합니다.
먼저 스왑 메모리 설정을 확인합니다.
sudo swapon --show
설정되어 있지 않다면 아무것도 출력되지 않습니다.
Ubuntu 24.04 기준으로는 기본적으로 다음과 같이 /swap.img가 설정되어 있습니다.
하지만 이 글은 설정되어 있지 않다는 전제로 진행합니다.
NAME TYPE SIZE USED PRIO
/swap.img file 8G 0B -2
스왑 설정: file
스왑 파일 생성
dd 명령으로 16 GiB 크기의 /swapfile 이라는 파일을 생성합니다.
(파일명은 뭘로 해도 상관없습니다.)
sudo dd if=/dev/zero of=/swapfile bs=1M count=16K
# 16384+0 records in
# 16384+0 records out
# 17179869184 bytes (17 GB, 16 GiB) copied, 11.2337 s, 1.5 GB/s
swapon 매뉴얼에도 명시1되어 있지만 fallocate는 사용하지 않는 것을 권장합니다.2
연속된 블록에 실제 데이터를 파일에 쓰는 dd와 달리 fallocate는 논리적인 파일의 크기만 설정하고 데이터를 쓰지 않기 때문입니다.
스왑 파일은 물리 메모리가 부족할 때 디스크에 데이터를 저장하는 역할을 합니다. 그리고 파일 시스템과 커널은 스왑 파일에 데이터를 효율적으로 읽고 쓰기 위해 파일의 실제 물리적 위치가 명확한 것이 좋습니다. 물리적으로 할당되지 않은 블록을 포함할 수 있는 Sparse file은 파일의 논리적인 크기와 실제 디스크에 할당된 크기가 다를 수 있기 때문에 스왑이 예상대로 동작하지 않을 수 있습니다.
권한 설정
Swap 파일을 root만 읽고 쓰도록 권한을 설정합니다.
sudo chmod 600 /swapfile
sudo ls -hal /swapfile
# -rw------- 1 root root 16.0G 3월 9 16:43 /swapfile
파일 형태 변경
파일 형태를 확인해보면 data 파일입니다.
sudo file /swapfile
# /swapfile: data
Swap 파일을 Linux swap file로 설정합니다.
sudo mkswap /swapfile
# Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
# no label, UUID=ec298bfb-0c82-4cd1-98aa-5466773f8a09
sudo file /swapfile
# /swapfile: Linux swap file, 4k page size, little endian, version 1, size 4194303 pages, 0 bad pages, no label, UUID=ec298bfb-0c82-4cd1-98aa-5466773f8a09
Swap 영역 설정
만든 Swap 파일을 swap 영역으로 설정합니다.
sudo swapon /swapfile
설정 확인
sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 16G 0B -2
사용되는 부분이 생기면 아래처럼 USED 부분에 사이즈가 커집니다.
NAME TYPE SIZE USED PRIO
/swapfile file 16G 153.3M -2
TYPE: Swap 메모리의 종류file: 파일partition: 디스크 파티션
SIZE: Swap 메모리의 크기USED: Swap 메모리의 사용량PRIO: Swap 메모리의 우선순위. 값이 클수록 우선적으로 사용됩니다.
부팅 시 자동 마운트 설정
Ubuntu 24.04 기준 기본 설정값에는 /swap.img 파일이 있습니다.
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/swap.img none swap sw 0 0
(위 설정이 없다는 전제 하에) 새로 추가한 스왑 영역을 추가합니다.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
용량 늘리기
스왑 메모리 크기는 시스템의 물리 메모리 용량과 사용 용도에 따라 결정됩니다.
free -h
# total used free shared buff/cache available
# Mem: 31Gi 24Gi 490Mi 3.9Gi 5.8Gi 2.0Gi
# Swap: 2.0Gi 1.3Gi 677Mi
사이즈를 늘리기 전 swap에서 파일을 제거합니다.
sudo swapoff /swapfile
사이즈를 늘립니다.
# 4GiB 추가
sudo dd if=/dev/zero of=/swapfile bs=1M count=4K oflag=append conv=notrunc
# 4096+0 records in
# 4096+0 records out
# 4294967296 bytes (4.3 GB, 4.0 GiB) copied, 4.60434 s, 933 MB/s
사이즈 늘린 것을 적용하려면 swapon -v 명령어로 다시 설정해야 합니다.
sudo mkswap /swapfile
# mkswap: /swapfile: warning: wiping old swap signature.
# Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
# no label, UUID=1516c52d-9ed8-4a52-939f-30a892aff73f
sudo swapon -v /swapfile ✭ ✱
# swapon: /swapfile: found signature [pagesize=4096, signature=swap]
# swapon: /swapfile: pagesize=4096, swapsize=8589934592, devsize=8589934592
# swapon /swapfile
free -h
# total used free shared buff/cache available
# Mem: 31Gi 24Gi 433Mi 4.0Gi 5.8Gi 1.5Gi
# Swap: 8.0Gi 1.3Gi 6.7Gi
비활성화
sudo swapoff /swapfile
/etc/fstab 파일에서 Swap 파일 설정을 제거합니다.
# /etc/fstab
# /swapfile none swap sw 0 0
swap file 교체
만약 기존 swap file을 교체하고 싶다면 새로 생성한 파일로 swapon 후 기존 swap 파일을 swapoff 하면 swap에 올라가있던 데이터들은 자동으로 옮겨집니다. 물론 애플리케이션에 따라 유실될 수도 있습니다.
sudo swapon /swap2file
# sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 16G 2G -2
/swap2file file 32G 0B -3
sudo swapoff /swapfile
# sudo swapon --show
NAME TYPE SIZE USED PRIO
/swap2file file 32G 1.5G -2
Kubernetes에서 Swap 기능을 비활성화해야 하는 이유
가장 큰 이유는 스왑 메모리가 있다면 Kubernetes는 메모리 부족 상황을 정확하게 파악할 수 없다는 것입니다.3 안정성을 위해 스왑 메모리를 비활성화하는 것이 좋습니다. 스왑이 자주 발생하면 디스크 입출력이 증가하면서 성능이 저하되는 문제도 있습니다.
Prometheus node-exporter를 이용한 모니터링
이 리포지터리를 클론해서 Prometheus와 Grafana를 실행해서 모니터링 할 수 있습니다.
sudo docker compose up -d

본인의 컴퓨팅 작업 시 사용량을 확인하면서 메모리 사용량이 항상 90% 이상이면 스왑 메모리를 늘리는 것을 고려해볼 수 있습니다.
더 읽을거리
- Swap Management | kernel.org
- Virtualization 101 - (3.1) 메모리 오버커밋과 메모리 여유공간 확보 방법 | 송주환
- kubelet swap on 체크 PR#31996
최종 수정: 2024-12-26