Overview
AWS 프리 티어 계정을 사용해 EC2로 키즈핑 프로젝트를 배포했습니다. 배포 과정에서 Docker를 활용하였으며, docker-compose.yml 파일을 통해 기본 Docker 네트워크에서 Spring Boot, MySQL, Redis를 각각 컨테이너로 구성하여 배포 환경을 구축했습니다.
배포 초기에는 Spring Boot와 MySQL만 컨테이너로 구성된 상태에서 Docker를 실행했습니다.
그러나 Docker가 실행된 후 ssh로 EC2에 접속한 터미널이 갑자기 작동하지 않는 문제가 발생했습니다.
다른 터미널을 통해 재접속을 시도했지만, 접속 과정에서 터미널이 중단되어 접속할 수 없었습니다.
결국, 기존 EC2 인스턴스를 삭제하고 새 EC2 인스턴스를 생성하여 다시 배포를 진행했습니다.
이번에는 Docker 실행 후 htop 명령어로 CPU와 메모리 사용량을 모니터링했는데, 아래 이미지처럼 사용량이 급속히 치솟으며 서버가 다운되었습니다.
이러한 문제를 해결하기 위해 자료를 찾아보니 AWS 프리티어 계정으로 EC2를 사용하다 보면 램 부족 현상으로 인해 서버가 자주 터진다고 합니다. 프로젝트 빌드 도중에 멈추기도 하고, 서버가 갑자기 다운되는 현상이 자주 발생할 수 있다고 하네요.
AWS 프리티어 EC2 인스턴스
AWS에서 제공하는 프리티어 EC2 인스턴스의 성능은 기본적으로 1GB 메모리와 스토리지 최대 30GB를 제공합니다.
스토리지 공간은 충분하지만, 램 부족 현상으로 인해 서버가 자주 다운되는 현상이 발생하게 됩니다.
따라서, 리눅스에서 제공하는 RAM swap을 통해 부족한 메모리 현상을 해결하고자 합니다.
Swap Space(스왑 공간)
먼저, Swap Memory 사용하기 전에 메모리 스왑을 할 공간(Swap Space)을 마련해야 합니다.
Swap Space는 물리적인 메모리 용량에 비례하여 마련해야 합니다.
RAM ≤ 2GB
Swap Space는 RAM의 2배의 공간을 마련해야 합니다.
- RAM이 1GB인 경우 Swap Space는 2GB
2GB < RAM < 32GB
Swap Space는 (RAM - 2GB) + 4GB 크기의 공간을 마련해야 한다.
- RAM이 4GB인 경우 Swap Space는 6GB
RAM ≥ 32GB
Swap Space는 RAM만큼의 공간을 마련해야 한다.
- RAM이 32GB인 경우 Swap Space는 32GB
RAM Swap 하기
배포한 EC2 인스턴스 스펙
- Ubuntu Server 22.04 LTS (HVM), SSD Volume Type
- 메모리 : 1GB
- 스토리지 : 30GB
시스템 업데이트
sudo apt update
텍스트 에디터 설치
sudo apt install -y nano
- vi(vim), emacs 등의 에디터도 사용해도 되지만, 가장 다루기 쉬운 nano를 설치했습니다.
Swap Space 생성하기
기본적으로 AWS 프리티어 계정에서 제공되는 무료 EC2 인스턴스는 메모리가 1GB이기 때문에 2배인 2GB로 생성합니다.
아래 명령어를 순서대로 입력하여 Swap Space를 생성합니다.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
다음과 같이 성공적으로 스왑공간이 생성되었는지 확인합니다.
// 출력
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=8f85218d-329c-4eec-bf11-5d87964c5f0d
RAM Swap 하기
아래 명령어를 통해 RAM Swap을 시작합니다.
sudo swapon /swapfile
이후 아래 명령어를 통해 스왑 생성에 대한 확인을 할 수 있습니다.
sudo swapon --show
// 출력
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
다음 명령어를 통해 시스템에서 사용할 수 있는 메모리 공간을 확인할 수 있습니다.
free -h
// 출력
total used free shared buff/cache available
Mem: 966Mi 267Mi 58Mi 0.0Ki 640Mi 509Mi
Swap: 2.0Gi 0B 2.0Gi
RAM Swap 자동 활성화
위 과정을 성공적으로 했다면, RAM Swap이 이루어집니다. 하지만, EC2 인스턴스를 재부팅하게 되면 다시 초기화되기 때문에 재부팅하더라도 자동으로 RAM Swap이 활성화되도록 설정해야 합니다.
RAM Swap 자동 활성화는 다음과 nano 에디터를 통해 설정할 수 있습니다.
sudo nano /etc/fstab
/swapfile swap swap defaults 0 0 명령어 추가
LABEL=cloudimg-rootfs / ext4 discard,errors=remount-ro 0 1
LABEL=UEFI /boot/efi vfat umask=0077 0 1
/swapfile swap swap defaults 0 0
이후 ctrl + s 단축키를 통해 수정한 텍스트 파일을 저장하고, ctrl + x 단축키를 통해 편집기를 종료하는 것으로 설정을 마칩니다.
마무리
htop 명령어를 통해 CPU와 메모리 사용량을 모니터링한 결과, 스왑 공간이 잘 설정된 것을 확인했습니다. 현재는 Redis까지 추가하여 총 3개의 컨테이너(Sprint Boot, MySQL, Redis)가 실행 중이며, 서버가 터지지 않고 안정적으로 잘 작동하고 있습니다.
이번 배포를 통해 EC2 인스턴스에서 메모리 부족 현상을 경험하게 되었고, 이를 해결하기 위해 RAM 스왑(Swap) 기능을 알게 되었습니다. RAM 스왑을 설정함으로써 메모리 부족 문제를 해결할 수 있었고, 서비스가 안정적으로 동작하도록 만들었습니다.
참고
https://blog.lael.be/post/6810
https://sundries-in-myidea.tistory.com/102
https://ittrue.tistory.com/297
'프로젝트 > Kidsping' 카테고리의 다른 글
트러블 슈팅 - 동시성 문제와 Double-Checked Locking 패턴 적용 (0) | 2024.11.04 |
---|---|
개발 기록 - 선착순 응모 시스템 이슈 및 해결 과정 (0) | 2024.10.30 |
개발 기록 - N + 1 문제 fetch join, Batch Size로 해결 (0) | 2024.10.24 |
개발 기록 - Java에서 Enum 의 비교는 '==' 인가? 'equals' 인가? (0) | 2024.10.22 |
개발 기록 - 자녀 성향 진단 로직 구현 및 리팩터링 (0) | 2024.10.22 |