문제 발생: 서버가 자꾸 죽다..?
현재 커뮤니티에서 팀을 꾸려서 팀프로젝트를 진행중이다.
나와 다른 백엔드 팀원 1명이서 서버 개발을 맡고 있고, 팀원 분이 서버 배포를 담당하셨다.
진짜 API 개발에 앞서 mock API만 개발해두고 서버에서 프론트엔드 분들이 swagger로 테스트할 수 있게 먼저 배포를 진행했고...
서버에 많은 작업이 일어날 일이 전혀 없는 그런 상태...였다.
근데.. 서버가.. 죽다?
처음에는 외부로부터의 비정상적인 접속인 줄 알았다.
삐빅- 아니었다.
서버에 접속하니 아무것도 안하는데 아래와 같이 메모리가 혼자 87%나 사용중이었다...(이러니까 금방 죽지ㅠㅠ)
원인
열심히 원인을 찾아 본 결과 의외로 간단한 문제였다.
메모리 부족!!
우리는 서버에 Spring boot와 mysql만 설치해놨기에 안심했으나.....
아무래도 무료 플랜이라.. 인스턴스의 사이즈는 매우 작고... 나약한 램이 버티지 못한 것이었다.
하지만 취준생들의 프로젝트이기 때문에 Free tier를 사용하고 있었고 플랜을 업그레이드 할 생각은 없었다.
그래서 해결책이 뭐냐고?
해결: SWAP(스왑) 파일을 만들어서 메모리 부족을 해결하자!
SWAP 메모리란, RAM이 부족할 경우 지정하여 HDD의 일정 공간을 마치 RAM처럼 사용하는 것이다.
하지만 RAM의 대체재라고 생각하기에는 속도가 RAM보다 느리다.
(당연하다! 그러니 메모리 부족을 해결하기 위한 조금 느린 추가 RAM을 얻었다고 생각하자!)
그럼 이 메모리는 얼마나 잡아야 하는가? 권장 SWAP 메모리는 아래와 같다.
물리적 RAM | SWAP 메모리 |
RAM 2GB 이하 | RAM 용량의 2배(최소 32MB) |
RAM 2GB 초과, 32GB 미만 | 4GB + (RAM – 2GB) |
RAM 32GB 이상 | RAM 용량의 1배 |
AWS의 Free tier를 통해 받을 수 있는 RAM은 1GB 정도로 작고 소중하기 때문에..(ㅠㅠ)
우리는 SWAP 메모리를 2GB 정도로 잡으면 된다.
다음은 SWAP 메모리 할당, 즉 SWAP 파일 생성하는 방법이다.
먼저 서버에 접속해주고 아래와 같이 명령어를 순차적으로 입력한다.
여기서 SWAP 메모리는 2GB를 할당하였다.
# swapfile 메모리를 할당
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
# swapfile 권한 세팅 (READ, WRITE)
sudo chmod 600 /swapfile
# swap 공간 생성 (Make swap)
sudo mkswap /swapfile
# swap 공간에 swapfile 추가하여 즉시 사용할 수 있도록
sudo swapon /swapfile
# /etc/fstab vi 에디터 열기
sudo vi /etc/fstab
# 파일의 맨 끝 다음줄에 아래 명령어 작성
/swapfile swap swap defaults 0 0
# ec2의 메모리 상태를 확인
free -h
SWAP 설정 전:
SWAP 설정 후:
메모리를 다 사용하지 않고 SWAP 메모리가 추가로 사용된다.
속도는 RAM보다 느리지만 RAM을 1GB만 사용했을 때와 다르게 그 이후로 서버가 혼자 죽는 일은 전혀 없다.
+) 게다가 처음 설정한지 약 3주가 지났고 현재는 SWAP 사용량이 늘어났기 때문에 서버에 부담은 더더욱 덜해졌다.
결론: 서버가 자꾸 죽는데 Free tier를 유지하고 싶다면 SWAP 메모리를 설정하여 사용해보자!
참고:
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
https://kth990303.tistory.com/361
'💻dev > 🔧오류와 해결' 카테고리의 다른 글
[해결] (Spring) Ambiguous handler methods mapped for HTTP path 오류 (0) | 2023.08.02 |
---|---|
[해결] AWS EC2 퍼블릭 IP 바뀜 -> 고정 IP 사용하기 (0) | 2023.07.04 |
[해결] 포스트맨에서 Cookie(쿠키)를 설정하고 API에서 @CookieValue로 받기 (1) | 2023.06.13 |
Java | java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 오류 해결하기 (0) | 2023.05.03 |
[해결] IntelliJ 빌드 후 finished with non-zero exit value 1 오류 해결하기 (0) | 2023.04.19 |