Nuwa Project - EC2 메모리 부족 현상
처음 서버 구축 당시에 EC2 서버에서 내 레포지토리를 Pull을 받은 후
jar 파일을 찾아 미리 작성한 start.sh를 이용하여 애플리케이션을 실행하고 stop.sh를 이용하여 종료하고
다시 배포하는 과정을 거치다가 CI/CD를 이용하여 편리하게 배포를 해보자!
이렇게하여 Github Actions, AWS S3, CodeDeploy를 사용하여 자동화 배포를 진행을 해보고
Downtime이 생기는 것을 방지하기 위해 Github Actions, Nginx, Docker, docker-compse를 이용하여
블루/그린 전략으로 자동화 배포를 성공한 적이 있었습니다.
현재도 동일한 방법을 사용하고 있었고 docker-compose로 현재 컨테이너가 무엇이 실행 중인지를 찾아
green -> blue
blue -> green
이런 방식으로 변경하는 스크립트를 작성하여 배포를 진행했습니다.
이 방식은 green 컨테이너가 실행 중 blue 컨테이너를 실행하고 health check를 성공하면
이미 실행 중이던 컨테이너를 종료하는 방식으로 진행을 했는데
전의 프로젝트에선 소켓을 사용하지 않았었고 데이터베이스도 RDS 하나로 사용했기에
EC2 프리티어로 충분히 사용이 가능했습니다.
하지만 이번 프로젝트에선 웹소켓을 사용하고, Docker를 이용하여 mongoDB, Redis, Application Container를
사용 중이여서 많은 리소스를 사용하고 있었습니다.
당연히 Github Actions를 이용하여 자동화 배포를 진행을 하고 있었는데
항상 어느 시점부터 무한로딩이 걸리기 시작했습니다.
이미 green 컨테이너는 실행이 되고 있고.. blue 컨테이너에서 오류가 나오지 않았지만
스프링부트 애플리케이션이 실행이 될 때 무한으로 로딩이 되는 문제가 생기며 배포가 진행이 되지 않았습니다..
이 문제를 해결하기 위해 검색을 하던 도중
프리티어는 AWS EC2 인스턴스의 램이 1GB이라는 것을 확인했습니다.
지속해서 배포가 되지 않는 점에 대해서 방법이 없을까 했는데 메모리 스왑이라는 좋은 해결법을 발견했습니다.
스왑 공간 크기 계산
일반적으로 다음과 같이 스왑 공간을 계산합니다.
물리적 RAM의 양 | 권장 스왑 공간 |
---|---|
RAM 2GB 이하 | RAM 용량의 2배(최소 32MB) |
RAM 2GB 초과, 32GB 미만 | 4GB + (RAM – 2GB) |
RAM 32GB 이상 | RAM 용량의 1배 |
참고: 스왑 공간은 절대로 32MB 미만이 되지 않아야 합니다.
그러면 어쨌든 EC2의 free tier를 통해서 RAM을 획득할 수 있는 것은 1GB이므로, 우리는 2GB정도로 생각하고 잡으면 된다.
출처: https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/
- dd 명령어로 swap 메모리를 할당합니다.
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
128M 16개의 공간을 만드는 것, count를 16으로 할당하여 2GB정도 차지하도록 합니다.
- 스왑 파일 읽기 및 쓰기 권한 주기
sudo chmod 600 /swapfile
- Linux 스왑 영역을 설정
sudo mkswap /swapfile
- 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 만듬
sudo swapon /swapfile
- 스왑 절차 성공했는지 확인
sudo swapon -s
- /etc/fstab 파일을 편접하여 부팅 시 스왑 파일을 활성화
sudo vim /etc/fstab
파일 끝 다음 줄에 새로 추가하고 저장
/swapfile swap swap defaults 0 0
이렇게 진행을 하게되면 스왑 영역이 설정됩니다.
이렇게하고 현재까지 자동화 배포 중 실패가 된 적은 없습니다..
참 멀고도 먼 인프라인 것 같습니다.
출처: https://sundries-in-myidea.tistory.com/102 [얇고 넓은 개발 블로그:티스토리]