이전에 만든 쇼핑몰 프로젝트를 AWS EC2에서 실행시키기 위해 작업을 했었다. 그런데 AWS 프리티어(무료계정)에서 제공하는 인스턴스의 메모리가 1GB밖에 되지 않아 스프링부트 서버를 실행하면 서버가 다운되는 현상이 발생했다.
그래서 해결방법을 찾다가 스왑 파일을 활용한 메모리를 할당하는 방법이 있다는걸 알게 되었다. 물론 하드디스크를 사용하는 것이라 속도가 조금 느려지지지만 서버가 멈추는 현상만은 막을 수 있으니 메모리가 낮은 시스템이라면 스왑을 설정해주는 걸 고려해보면 좋을 것 같다.
하드디스크 일부 영역을 메모리로 사용하는 것을 스왑이라고 한다.
메모리가 비싸던 시절에 흔하게 사용하던 방법이라 요즘에는 거의 사용을 안한다. 하지만 메모리가 낮은 시스템에서는 설정해 주는 것이 좋다.
(메모리가 많은 시스템에서는 스왑을 설정해도 메모리가 많이 남기 때문에 스왑 영역을 사용하지 않는다.)
추가로 HDD 환경에서 SWAP은 느리기 때문에 추천하지 않지만, SSD 환경에서 SWAP은 나름 쓸만하다.
여러개의 swapfile 을 동시에 사용할 수 있다. 1GB 의 swapon 상태에서, 2GB 의 swapfile 을 만들고 swapon 해주면, swap 은 3GB 가 된다.
dd명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성한다. 명령에서 bs는 블록 크기이고 count는 블록 수이다. 스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값이다. 이러한 값을 조정하여 원하는 스왑 파일 크기를 결정한다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
시스템의 내의 다른 사용자가 스왑파일을 지운다면 문제가 발생할 수도 있기 때문에 권한을 변경해준다.
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 한다.
$ sudo swapon /swapfile
$ sudo swapon -s
"/etc/fstab/" 파일을 편집하여 부팅 시 스왑 파일을 활성화 한다.
$ sudo vi /etc/fstab
해당 내용 추가
/swapfile swap swap defaults 0 0
$ free -m
시스템의 최대 성능을 위해서 당연히 Memory 영역을 먼저 사용한다. (메모리는 SSD 보다 월등히 빠르기 때문)
어느정도의 Memory 사용량이 차면, 시스템은 메모리에서 필요하지 않는 데이터를 비우는 작업을 한다. 그 이후에도 메모리 공간이 부족하여, 작업을 실행할 수 없다면 메모리 에러가 발생한다.
하지만 Swap 이 있는 경우에는 Swap 을 사용하기 시작한다.
어느 정도의 시간이 지난 후에 시스템에서 free -m 명령어를 통해 메모리를 확인했을 때, swap 을 많이 사용중이라면 메모리 증설을 고려해 보아야 한다. (일반적으로 swap 사용량은 0이거나 매우 적다.)
swap 켜는 구문 제거. (또는 cron 에서 제거)
/etc/rc.local 파일에서 swapon 관련 명령어 제거
swap 연결 해제.
swapoff /root/swapfile
디스크 블럭 파일 삭제.
rm /root/swapfile