일상에서의 스왑 메모리 (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

Kubernetes에서 Swap 기능을 비활성화해야 하는 이유

가장 큰 이유는 스왑 메모리가 있다면 Kubernetes는 메모리 부족 상황을 정확하게 파악할 수 없다는 것이다.3 안정성을 위해 스왑 메모리를 비활성화하는 것이 좋다. 스왑이 자주 발생하면 디스크 입출력이 증가하면서 성능이 저하되는 문제도 있다.

Prometheus node-exporter를 이용한 모니터링

이 리포지터리를 클론해서 Prometheus와 Grafana를 실행해서 모니터링 할 수 있다.

sudo docker compose up -d

Node Monitoring with Prometheus and Grafana

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

더 읽을거리


최종 수정: 2024-09-05