일상에서의 스왑 메모리 (Swap Memory)
스왑 메모리 설정과 모니터링

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

Node Monitoring with Prometheus and Grafana

본인의 컴퓨팅 작업 시 사용량을 확인하면서 메모리 사용량이 항상 90% 이상이면 스왑 메모리를 늘리는 것을 고려해볼 수 있습니다.

더 읽을거리


최종 수정: 2024-12-26