EC2 프리티어 버전 하나에 젠킨스, 백엔드 서버(Spring), DB(Docker), Redis(Docker)를 모두 돌리려고 하니 메모리가 부족해 인스턴스가 죽는 상황이 발생했습니다.(프론트엔드(React) 도 돌리려고 했음 ㅎㅎ..)
EC2 프리티어 버전은 vCPU 1개, RAM 1GB, 스토리지 8GB(최대 30GB) 입니다. 여기서 비교적 여유가 있는 스토리지의 용량을 활용해 Swap 메모리를 활용해 해결했습니다.
리눅스에서는 SWAP 메모리를 지정해 사용할 수 있습니다.
이 때, Swap 메모리란 RAM이 부족한 경우 스토리지(HDD)의 일정공간을 마치 RAM처럼 사용하는 것을 말합니다. 이를 통해 RAM을 증설한 듯한 효과를 볼 수 있습니다.
보통 swap memory는 할당된 램 메모리의 2배 또는 그 이상을 추천하고 있어 2GB 이상의 swap memory를 확보했습니다.
dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성합니다.
명령에서 bs
는 블록 크기이고 count
는 블록 수입니다. 스왑 파일의 크기
는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값입니다. 이러한 값을 조정하여 원하는 스왑 파일 크기를 결정합니다.
지정한 블록 크기는 인스턴스에서 사용 가능한 메모리보다 작아야 합니다. 그렇지 않으면 "memory exhausted" 오류가 발생합니다.
이 상황의 dd 명령에서 스왑 파일은 2GB(128MB x 16)입니다.
$ 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
위에서 vi로 연 파일의 끝에 다음 줄을 새로 추가하고 파일을 저장한 다음 종료합니다.
/swapfile swap swap defaults 0 0
free
위의 캡쳐는 4GB를 swap memory로 확보했을 때의 결과입니다.
2GB를 확보했다면 Swap 행의 total 열이 2097144 정도가 되어 있을 것입니다.
Scale-Up을 통해 RAM을 업그레이드 하는 방법에 비해서는 느리지만 취준생의 자금 상황을 생각하면 괜찮은 방법이라고 생각합니다.
정보 감사합니다.