👾 문제식별
개인프로젝트를 AWS를 이용해 배포해보았다.
과금을 피하기 위해 t2.micro 인스턴스를 할당 받고, docker와 jdk를 설치하였다.
원격저장소에서 소스를 가져오기 위해 git도 설치하고, docker로 db 실행 => 파일 빌드 => jar 실행의 순서를 거쳐 배포를 진행하였다.
생각보다 수월하게 진행되었다.
잘 띄워진건지 log파일을 살펴보려 접근 시도를 하였는데, 갑자기 터미널에 아무 반응도 없다...
아무것도 써지지 않아서 ssh환경을 나갈 수도 없었다.
서버가 죽었나 싶어서 ec2 인스턴스 정보를 보니 인스턴스의 상태는 '실행중' 이었으나,
2개의 상태검사 중 인스턴스 상태 검사가 실패한 상황이었다.
🔍 원인분석
원인은 너무 적은 t2.micro의 메모리 때문이다.
RAM 1기가가 제공되는데, 도커로 db를 켜고, jar 파일을 demon으로 실행해버리면 바로 cpu 100을 찍는다.
🤔 해결방법시도
1. 인스턴스 재시작 하기 : 아무런 효과가 없었다.
2. 중지후 시작 : 처음에는 접속이 잘되고 문제 없는 것처럼 보이지만, 빌드를 하는 순간 먹통이 되어버린다. 빌드가 30분이 넘어가버림..
3. 인터넷 검색 : 이미 먼저 이런 현상을 겪으신 인터넷 선배님들의 글을 찾아보았다.
swap.. 스왑 공간을 설정하라.. 이런 내용이 공통적으로 조회되었다.
하지만 swap이란 개념을 모르는 나는 왠지 모르게 어려울 것 같아서 계속 다른 방법을 찾아 헤맸으나..
AWS에서 공식적으로 작성한 글을 보고 swap 메모리 할당에 도전해보았다.
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
스왑 파일을 사용하여 Amazon EC2 인스턴스에서 메모리를 스왑 스페이스로 할당합니다.
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 스왑 파일로 사용할 메모리를 할당하고 싶습니다. 어떻게 해야 하나요?
repost.aws
✅ 최종해결방법
결국 회피했던 메모리 swap으로 서버가 멈추는 현상을 해결하였다.
🔗 ec2 swap 메모리 설정하는 자세한 방법 >> https://dev-heeya.tistory.com/85
위와 같이 스왑 공간을 할당하고 인스턴스를 재시작했더니
jar파일 배포를 진행해도 서버가 멈추지 않고 2개의 검사를 모두 통과한걸 볼 수 있다.
💡 해결 방법 설명
일단 따라하여 인스턴스의 메모리 부족 현상을 해결한 후, swap이란 뭔지 알아보았다.
- 메모리 swap 이란
메모리 스왑(Swap)은 실제 RAM(물리적 메모리)이 부족할 때, 디스크 공간을 가상의 메모리처럼 사용하는 기능이다.
스왑 공간은 일반적으로 운영 체제의 메모리 관리 방식의 일환으로, 프로그램이 필요로 하는 메모리를 제공하기 위해 사용된다.
쉽게 말해서 스왑공간을 설정하여, 서버 이용 중에 RAM이 부족해지면 설정했던 스왑공간의 크기만큼
내 디스크 공간을 가상의 메모리처럼 사용하여, 부족한 RAM을 지원하는 것이다.
스왑 공간은 일반적으로 SSD나 HDD와 같은 디스크에 저장되는데,
이로 인해 RAM보다 접근 속도가 느리기 때문에, 성능 저하가 발생할 수 있으니 필요한 만큼만 적절하게 설정하는 것이 좋다.
📝 재발 방지 대책
할당 받은 인스턴스의 사양과 내가 올릴 시스템들의 용량에 대해서 생각을 안해봤던 것 같다.
아무래도 회사에서 근무할때에는 담당 인프라 직원분들이 알아서 잘 해주시기 때문에 운영하면서 크게 신경쓰지 않았다.
하지만 갑자기 트래픽이 몰리는 등 운영중에 서버가 과부하되는 경우는 분명히 존재한다.
지금 서버의 가용 RAM이 얼마고, 서버 내에 돌아가고 있는 시스템을 얼마를 차지하고 있는지 확인하는 방법을 알아두고, 지속적으로 모니터링 하는것이 좋을 것 같다.
'개발 공부 > 트러블슈팅' 카테고리의 다른 글
@OneToMany 관계 정의 후, getter 호출 시 NullPointerException이 발생하는 원인과 문제 해결 (0) | 2024.09.29 |
---|---|
H2 datasource 정보 입력이후, NullPointerException이 발생하는 원인과 해결방법 (2) | 2024.09.14 |
[Spring Security] permit을 적용한 API를 테스트 했을때 401 에러가 발생하는 원인과 해결방법 (2) | 2024.08.31 |
@Valid 가 작동하지 않는 원인과 해결방법 (0) | 2024.08.26 |
@RequestBody로 객체를 받을 때 @Builder만 있으면 발생하는 400 에러 원인과 해결방법 (0) | 2024.08.25 |