gcp vm 인스턴스 swap 스왑 메모리 적용하는 방법
GCP VM 인스턴스 스왑 메모리(swap) 적용하는 방법
스왑 메모리(swap memory)란?
시스템에서 메모리(RAM)가 부족할 경우 프로세스는 더 이상 작업을 이어가지 못하고 종료되는데요.
스왑 메모리는 시스템에 메모리가 부족한 상황에서 하드 디스크의 일부 공간을 활용하여 작업이 계속되도록 도와주는 영역으로, '하드 디스크의 일부를 RAM처럼 사용할 수 있게 만드는 방법'입니다.
RAM처럼 사용할 수 있게 만들었다지만 하드 디스크 상에 위치하기 때문에 RAM에 접근하는 것보다 접근 속도가 느리며, 따라서 데이터를 처리하는 속도도 느린데요.
속도는 느리지만 메모리가 부족하여 시스템이 다운되거나 장애를 발생시키는 것 보다는 스왑 메모리를 활용하는 것이 안전성 측면에서 뛰어나다는 장점이 있습니다.
대부분의 리눅스(linux) 운영체제에서는 swap 파티션 생성을 권장하고 있으며, swap 파티션이 없어도 운영체제 동작에는 문제가 없습니다.
swap partition, swap file
'swap partition 방식'은 mkswap 명령에 의해 스왑 공간으로 지정된 표준 디스크 파티션이며, 'swap file 방식'은 일반적인 file을 만든 다음 mkswap 명령을 통해 swap 공간으로 지정하는 방식입니다.
파일을 통한 방식은 파티션을 생성할 여유 디스크 공간이 없을 때 사용되며, 꼭 필요한 경우가 아니라면 스왑 파일 방식보다 스왑 파티션 방식이 권장됩니다.
(아래 스왑 메모리를 적용하는 예시는 무료 등급 gcp 인스턴스의 제한으로 인해 swap file 방식을 사용하였으며, 테스트 환경은 Ubuntu 18.04 버전입니다.)
vm instance, swap file 방식 적용
스왑 영역을 확인하는 명령어 'free -h' 또는 'swapon -s'를 통해 instance를 살펴보면 현재 적용된 swap 영역이 없는 것을 확인할 수 있는데요.
(swapon -s 명령어의 경우 스왑 영역이 없으면 출력되는 값이 없습니다.)
1. 스왑 파일 생성
먼저 원하는 스왑 공간 크기를 가진 파일을 생성합니다.
'dd 명령어'에서 /dev/zero는 '0x00'으로 가득 찬 리눅스 장치 파일을 가리키는데요. bs는 한 번에 읽어들일 사이즈를 의미하며, count는 횟수를 의미합니다.
즉, 해당 코드는 /dev/zero에서 1024 바이트씩 2024000번을 읽어 /swapfile에 기록한다는 명령어입니다.
//dd 명령어를 통한 swap file 생성
dd if=/dev/zero bs=1024 count=2024000 of=/swapfile
//fallocate 명령어를 통한 swap file 생성
fallocate -l 2G /swapfile
(2GB 공간을 가진 swap file 생성)
'fallocate' 명령어를 사용하여 파일을 생성할 수도 있는데요.
fallocate 명령어를 사용하는 방식이 dd 명령어를 사용하는 방식에 비해 빠를 수는 있지만, swap에 사용될 파일로 적합하지 않다는 내용이 있어 dd 명령어를 통해 스왑 파일을 생성하였습니다.
2. mkswap, swapon
//mkswap 명령어를 통해 해당 파일이 스왑 공간으로 사용될 것임을 명시
mkswap /swapfile
//swapon 명령어를 통해 스왑 파일 활성화
swapon /swapfile
mkswap /swapfile 명령어를 통해 해당 파일이 스왑 공간으로 사용된다는 것을 운영체제에 알립니다.
이어서 swapon /swapfile 명령어를 통해 스왑 파일을 활성화 합니다.
이때 insecure permissions 0644, 0600 suggested. 라는 경고성 메세지가 나오는데요. chmod 명령어로 해당 파일의 권한을 644또는 600으로 수정해줍니다.
3. 스왑 적용 확인
여기까지 적용되었다면 'free -f' 명령어 또는 'swapon --show' 명령어를 통해 스왑 영역이 정상적으로 적용되었는지 확인할 수 있습니다.
4. 변경 사항을 영구적으로 적용
적용된 스왑 영역은 시스템이 재부팅되었을 때 다시 사라집니다.
때문에 시스템이 재부팅되어도 스왑 영역이 그대로 적용되도록 /etc/fstab 파일에 아래 내용을 추가해줘야 하는데요.
/swapfile none swap sw 0 0
* 이러한 설정 파일을 수정할 때는 혹시 모를 상황을 대비하여 '원본파일명_backup' 이라는 백업 파일을 생성해두고 수정하는 것이 좋습니다.
스왑 메모리 사용 빈도 설정
root@instance-2:~# sysctl vm.swappiness
vm.swappiness = 60
root@instance-2:~# cat /proc/sys/vm/swappiness
60
스왑 메모리에는 swappiness라는 스왑 활용도를 설정하는 매개 변수가 존재하는데요.
swappiness 값의 범위는 0 ~ 100으로 0의 경우 스왑을 사용하지 않는 것이며, 1은 스왑 사용을 최소화하는 것, 100은 스왑을 적극적으로 사용하는 것을 의미합니다.
(swappiness 변수의 default 값은 60입니다.)
설정된 swappiness 값을 조회하는 명령어로는 위에 두 명령어가 있으며, 변경은 아래 명령어를 통해 적용할 수 있는데요.
//명령어1
$ sysctl vm.swappiness=10
//명령어2
$ sysctl -w vm.swappiness=10
//명령어3
$ echo 10 > /proc/sys/vm/swappiness
해당 방식은 스왑 활용도를 즉시 적용하는 방식으로 재부팅 시 값이 초기화됩니다.
따라서 적용되는 swappiness 값을 영구적으로 적용하고 싶다면 아래와 같이 /etc/sysctl.conf 설정 파일의 수정을 통해 vm.swappiness 값을 영구 적용할 수 있습니다.
vi /etc/sysctl.conf
vm.swappiness=10
< 참고 자료 >
https://opensource.com/article/18/9/swap-space-linux-systems