환경
-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
위 명령어를 통해서 스프링부트 프로젝트를 빌드를 하는데 아무리 기다려도 완료가 되지 않았다.
원인
스프링 부트 프로젝트를 빌드하는 과정에서는 많은 메모리를 필요로 하기 때문에, 메모리가 부족하면 빌드가 매우 느려지거나 아예 완료되지 않을 수 있다.
t2가 메모리를 1GiB 만 제공하기 때문에 스프링 부트 프로젝트를 빌드하는데 실패한 것이었다.
해결 방법
1. 인스턴스 유형을 업그레이드 하여 더 많은 메모리를 사용
예를들어, 예를 들어, t2.medium 인스턴스는 4 GiB의 메모리를 제공하기 때문에 이로 인스턴스를 교체하는 방법도 있다.
하지만 나는 돈이 없는 학생이기 때문이 이 방법을 선택하지 않았다.
2. 스왑 메모리 사용
스왑 메모리
스왑 메모리는 시스템의 물리적 메모리(RAM)가 부족할 때 하드 디스크의 일부를 가상 메모리로 사용하는 것이다. 이렇게 하면 RAM이 부족할 때 시스템이 멈추는 대신 디스크를 사용하여 추가적인 메모리를 확보할 수 있다.
나의 서버 배포 환경을 보면, 램은 1GiB 이고, 저장 장치 볼륨 크기는 30GiB이다.
램의 용량이 저장 장치 볼륨 크기보다 상대적으로 작은 것을 확인할 수 있다.
그래서 저장 장치의 볼륨을 빌리는 것이다.
관련 개념은 아래의 글을 참고하기를 바란다.
2023.07.02 - [컴퓨터 구조 & 운영체제/운영체제] - [운영체제] 페이징을 통한 가상 메모리 관리
[운영체제] 페이징을 통한 가상 메모리 관리
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 연속 메모리 할당의 문제점은 아래와 같다. 외부 단편화
rebugs.tistory.com
1. 스왑 파일 생성
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
- dd: 데이터를 복사하는 명령어이다.
- if=/dev/zero: 입력 파일로서, 크기가 0인 무한대의 빈 바이트 스트림을 제공하는 특수 파일이다.
- of=/swapfile: 출력 파일로서, 이 경우 스왑 파일의 경로를 지정한다.
- bs=128M: 블록 크기를 128MB로 설정한다.
- count=16: 128MB 블록을 16번 써서 2GB(128MB * 16)의 스왑 파일을 생성한다.
2. 스왑 파일에 대한 권한 설정
sudo chmod 600 /swapfile
- chmod 600 /swapfile: 스왑 파일의 권한을 소유자만 읽고 쓸 수 있도록 설정한다.
- 600: 소유자에게만 읽기와 쓰기 권한을 부여하는 권한 설정 값이다.
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': 스왑 파일을 /etc/fstab 파일에 추가하기 위한 문자열을 생성한다.
- | sudo tee -a /etc/fstab: 생성된 문자열을 /etc/fstab 파일의 끝에 추가한다.
- /etc/fstab: 시스템이 부팅될 때 자동으로 마운트할 파일 시스템 목록을 지정하는 파일이다.
이렇게 스왑 메모리를 사용하면 부족한 메모리를 하드 디스크로 대체할 수 있다.
참고
https://ksh-coding.tistory.com/40
EC2 gradle build 시 무한 로딩 오류(메모리 문제)
EC2에서 git clone으로 서버 파일을 clone하고 ./gradlew test 를 했는데 :compileQuerydsl 에서 무한 로딩이 걸리고 넘어가지 않았다. 구글링을 진행해보니 무한 로딩이 걸리는 오류는 메모리 부족 문제일 수
ksh-coding.tistory.com
ec2 스프링 빌드 시 멈춤 현상 해결법
스프링 빌드를 하는데 빌드 시간이 1초씩 늘어나는게 아니라 10초 이상씩 늘고, 빌드도 안되길래 여러번 껐다 켰다 반복해서 빌드를 해봤는데 소용없었다 free tier로 ec2를 이용하면 ram이 1기가라
jjong2.tistory.com
'DevOps > AWS' 카테고리의 다른 글
[AWS + SpringBoot] 시간대 설정하기 (0) | 2024.09.20 |
---|---|
[AWS] Mac 에서 터미널로 EC2 접속 (0) | 2024.09.04 |
[AWS, JPA, MySQL] Table doesn't exist (0) | 2024.06.30 |
[Spring Boot, Linux] Error resolving template (0) | 2024.06.30 |