[AWS] EC2 프리티어 프로젝트 빌드시 무한 로딩

문제 발생

프로젝트를 배포 해놓은 후 변경사항이 있을 때 서버환경에서 쉽게 변경사항을 적용하기 위해

아래와 같은 쉘 스크립트를 만들고 실행하였다!

하지만 언제부턴가 스크립트를 실행하면 build를 하는 도중 서버가 먹통이 된다는 것을 알게 되었다!

그래서 처음으로 생각해낸 방법이 인스턴스를 중지 후 다시 시작하는 것이었다.

하지만 매번 이렇게 인스턴스를 중지 -> 시작 할 수 없기에 다른 방법을 찾아보았다.  

#!/bin/bash

REPOSITORY=/home/ubuntu
PROJECT_NAME=PublicPlace_BE

cd $REPOSITORY/$PROJECT_NAME

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew clean bootjar

echo "> step1 디렉토리 이동"
cd $REPOSITORY

echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동적인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    kill -15 $CURRENT_PID
    sleep 5
fi

echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME > backend.log 2>&1 &

해결방법

새로운 방법을 찾기 위해 인터넷을 찾던 도중 EC2 인스턴스에 메모리가 부족해서 이런 현상이 발생한다는 것을 알게 되었다.

그러던 와중에 문득 정보처리기사를 공부 할 때와 작년 운영체제 수업에서 들었던 가상 메모리가 생각이 났다

스왑 메모리란?

스왑 메모리는 컴퓨터 시스템에서 물리 RAM(주메모리)이 부족할 때 사용하는 디스크 공간이다.

RAM에서 사용되지 않는 데이터를 일시적으로 저장함으로써, 실제 메모리를 사용할 수 있게 돕는다.

스왑 메모리의 장점

  • 비용 효율
    • 추가 RAM을 구매하지 않고도 디스크 공간을 활용하여 메모리 용량을 늘릴 수 있다
  • 시스템 유연성
    • 시스템의 메모리 관리에 더 많은 유연성을 제공하며, RAM 사용이 최적화되도록 돕는다
  • 작업 연속성 보장
    • 메모리가 부족할 때 프로그램이 강제 종료되는 것을 방지하고, 사용자가 다수의 애플리케이션을 동시에 실행 할 수 있게 한다

그래서 어떻게 사용할까?

1. 스왑 파일 생성

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

sudo dd: 관리자 권한으로 데이터를 복사한다

if=/dev/zero: 스왑 파일에 모두 0으로 채워진 데이터를 생성한다

of=/swapfile: 출력 파일을 /swapfile로 지정, 새롭게 생성된 스왑 파일

bs=128M count=16: 128MB 블록을 16번 작성 128MB x 16 = 2048MB, 즉 2GB 크기의 스왑 파일이 생성

2. 스왑 파일에 대한 권한 설정

sudo chmod 600 /swapfile

chmod 600 /swapfile: 관리자 권한으로 스왑 파일의 권한으로 소유자만 읽고 쓸 수 있도록 설정한다

3. 스왑 영역으로 설정

sudo mkswap /swapfile

mkswap /swapfile: 관리자 권한으로 스왑 파일을 스왑 영역으로 초기화하여 사용을 준비한다

4. 스왑 사용 시작

sudo swapon /swapfile

swapon /swapfile: 관리자 권한으로 스왑 파일을 활성화하여 스왑 메로리를 사용하기 시작한다

5. 스왑 상태 확인

sudo swapon -s

6. 재부팅 후에도 스왑이 유지되도록 설정

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

echo '/swapfile none swap sw 0 0': 스왑 파일 마운트 정보를 출력

| sudo tee -a /etc/fstab: /etc/fstab 파일에 위 내용을 추가해, 부팅 시 스왑 파일을 자동으로 마운트

느낀점

이제 프로젝트 변경사항을 손쉽게 배포된 서버에 적용할 수 있게 되었다!!!

처음 접하는 내용을 적용한 것이 아니라 내가 정보처리기사나, 학교 수업에서 배우고 공부했던 것들을 이렇게 적용할 수 있다는 점이 알게 모르게 뿌듯했다...ㅎ

참고

https://rebugs.tistory.com/654

 

[AWS EC2] 프리티어 인스턴스 사용시 Gradle build 시 무한 로딩 오류

환경-OS : Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1008-aws x86_64) (프리티어)-인스턴스 유형 : t2.micro(1 GiB 메모리), (프리티어)-스토리지(ELB) : 1 x 30 GiB(gp3) 문제 상황./gradlew clean build위 명령어를 통해서 스프링부트

rebugs.tistory.com

https://thisisjoos.tistory.com/638

 

컴퓨터 구조와 Swap Memory (스왑 메모리)

CPU (Central Processing Unit) 컴퓨터의 "두뇌"로, 모든 명령어의 실행과 데이터의 처리를 담당한다. 이는 프로그램의 명령어를 해석하고, 산술 및 논리 연산을 수행하는 장치이다. 주 메모리 :: RAM (Random

thisisjoos.tistory.com