스왑 메모리는 물리 메모리 용량이 부족할 때 사용되는 가상 메모리 영역입니다. 고사양 작업 중 메모리가 부족해서 컴퓨터가 자주 멈춘다면 스왑 메모리를 늘려보는 것도 하나의 방법입니다. 이 글은 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