SPRING

EC2에서 SPRING APPLICATION이 돌아가지 않을 때 (FEAT. SWAP MEMORY)

짜비 2021. 4. 4. 20:55

문제 상황

LOCAL에서 작업한 스프링을 EC2 서버에 배포하려고 했다.

./gradlew build

명령어로 jar file을 생성하고,

 

java -jar xxx.jar

명령어로 spring application을 실행시켰다. 그런데...

build를 하다가 db connection 하는 작업에서 멈춰버렸다. 설상가상으로 ctrl+c 도 안 먹어서 인스턴스를 여러 번 껐다 켰다...

 

지인에게 조언을 구하니 ec2에서 swap memory를 할당해주지 않아서 생기는 문제인 것 같다고.

free -m

명령어로 확인해보니 정말 swap memory가 0이었다.

그런데 swap memory란 뭘까?

 


swap memory

 

하드디스크의 일부를 확장된 RAM처럼 사용할 수 있게 만드는 것. OS는 메모리에 올라와 있는 프레임 중에서 당장 쓰이지 않는 것을 이 공간(swap memory)에 내려놓아서(swap-out) 사용 가능한 메모리 영역을 늘린다.

 

swap memory가 0이었기 때문에

메모리가 꽉 차도 OS는 프레임을 내려놓을 공간이 없음 -> 메모리가 꽉 찬 상태에서 Thrashing 발생.

그래서 프로세스가 죽어버리거나 혹은 쉘에서 아무런 입력도 하지 못하게 된 듯하다.

그러면 swap memory를 할당하려면 어떻게 해야 할까?

 


linux에서 swap memory 할당하는 방법

검색해보니 aws에서 document로 제공하는 것이 있다. 그대로 옮겨왔다.

 

1.    dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성합니다. 명령에서 bs는 블록 크기이고 count는 블록 수입니다. 스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값입니다. 이러한 값을 조정하여 원하는 스왑 파일 크기를 결정합니다.

지정한 블록 크기는 인스턴스에서 사용 가능한 메모리보다 작아야 합니다. 그렇지 않으면 "memory exhausted" 오류가 발생합니다.

이 예제 dd 명령에서 스왑 파일은 4GB(128MB x 32)입니다.

$ sudo dd if=/dev/zero of=/swapfile bs=128M count=32

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

파일 끝에 다음 줄을 새로 추가하고 파일을 저장한 다음 종료합니다.

/swapfile swap swap defaults 0 0

 

찾아보니 swap memory는 RAM 용량에 따라,

RAM 용량 권장 SWAP MEMORY 용량
2 GB 미만 RAM의 2배 
2 ~ 8 GB RAM과 동일 
8 ~ 64 GB 4 GB 이상 8GB 이하
64 GB 초과 4 GB 이상 8GB 이하

로 설정하는 것이 권장된다고 한다. 위 1번 명령어에서 count 값을 적절히 조정해서 권장 용량에 맞게 SWAP MEMORY를 할당하면 되겠다.

 


나가며

이처럼 swap memory를 할당하는 것 외에 서버 성능을 향상하는 것(scale-up)도 해결 방법이 될 수 있다.하지만 돈이 드니까... 서버를 바꾸기 전에 swap memory를 먼저 할당해보는 것을 추천한다. 

 

 

 

References

aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/

kimhyun2017.tistory.com/20