spring boot 서버를 배포하기 위해서 AWS EC2 프리티어 인스턴스를 생성하였다.
그 후, ./gradlew build 명령어를 이용하여 빌드되는 과정중, 아래와 같이 Test 코드가 실행되는 시점에서 EC2가 먹통이 되었다.
root@ip-tmp-ip-tmp-ip:/home/ubuntu/spring-lol-team-maker# ./gradlew build
Starting a Gradle Daemon (subsequent builds will be faster)
<==========---> 78% EXECUTING [41s]
> :test > 0 tests completed
> :test > Executing test carrotbat410.lol.LolApplicationTests
5분, 10분을 기다려도 진행 시간은 바뀌는데, 진행이 전혀 되지 않았다.
인스턴스를 삭제하고 재시도해도 결과는 같았다.
EC2 프리티어의 메모리가 1GB밖에 되지 않아 발생하는 현상이라 한다.
이 문제를 해결하기 위해서는 메모리를 늘려줘야한다.
돈을 주고 메모리를 늘리면 되겠지만, 돈이 나간다.
다른 방안으로는 저장 공간 일부가 메모리역할을 하도록 스왑(swap) 영역을 설정하면 된다.
# 스왑 파일 생성하는 방법
1. 스왑 파일 생성
// aws 예제에는 4GB(128MB x 32)로 되어 있지만, 권장 스왑 공간 크기 계산에 따라 2GB(128MB x 16)로 수정했다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
2. 스왑 파일의 읽기 및 쓰기 권한을 업데이트
$ sudo chmod 600 /swapfile
3. Linux 스왑 영역을 설정
$ sudo mkswap /swapfile
4. 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용 가능하게 설정
$ sudo swapon /swapfile
5. 절차가 성공적으로 완료되었는지 확인
$ sudo swapon -s
6. 부팅 시 /etc/fstab 파일을 편집하여 스왑 파일을 시작.
편집기에서 파일 열기
$ sudo vi /etc/fstab
파일 끝에 다음 새 줄을 추가하고 파일을 저장하기
(vi 편집기는 i누르면 insert할 수 있다. 수정이 완료되면 esc후 :wq입력하여 저장하기)
/swapfile swap swap defaults 0 0
스왑 파일로 사용할 메모리를 할당후, 다시 ./gradlew build 명령어를 통해 빌드하니 막히던 테스트 부분이 정상적으로 동작하였다.!!!
참고로 AWS에서는 이렇게 스왑 공간을 권장하고 있다.
프리티어는 RAM이 1GB이므로 권장 스왑 공간의 2배를 설정해주었다.
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
https://repost.aws/ko/knowledge-center/ec2-memory-partition-hard-drive
https://okky.kr/articles/884329