Troubleshooting

AWS EC2 스프링 배포 중 멈춤(스왑 공간 추가)

ride-dev 2023. 9. 8. 17:07

1. 오류원인

리눅스는 물리적인 메모리, RAM(Random Access Memory)을 페이지(메모리 조각)로 나눕니다.

(리눅스에서 가용한 가상 메모리의 양은 RAM과 스왑 공간을 더한 것입니다)

만약 물리적인 메모리(RAM)의 용량이 가득 차게 될 경우,

시스템이 충돌하여 정지될 수 있습니다.

EC2 인스턴스를 프리티어로 만든 경우, 물리적인 메모리의 용량이 작아서

응용 프로그램을 가동 중 정지할 수 있습니다.

2. 오류내용

EC2가 정지했습니다.

ssh가 작동을 하지 않습니다.

인스턴스 모니터링의 CPU 사용률입니다.

EC2인스턴스 CPU 사용률(%)

Spring Boot가 스크립트로 실행된 후, CPU 사용률이 높아지며 ssh를 통한 원격 접근이 불가능해졌습니다.

3. 해결책

0. 인스턴스를 재부팅합니다(임시).

재접근을 하기 위해 인스턴스를 재부팅 할 수 있습니다.

인스턴스 상태

그러나, 다시 오류가 발생할 수 있습니다.

 

근본적인 해결책은 인스턴스가 감당할 수 있도록,

가상메모리의 양을 늘리는 것입니다.

얼마나 늘려야 할까요?

https://ride-dev.tistory.com/10

 

방법은 크게 두 가지입니다.

AWS 프리티어가 아니라면, 손쉽게 물리적인 메모리의 용량을 늘려줄 수 있습니다.

1. 물리적인 메모리의 용량을 늘려줍니다.

인스턴스 유형을 변경합니다.

(프리티어의 경우 제한이 있을 수 있습니다)

1. 기존보다 큰 물리적 용량을 가진 인스턴스를 생성합니다.

2. 인스턴스를 중지 후 인스턴스 유형을 변경합니다.

인스턴스 > 작업 > 인스턴스 유형 변경 > 적용

※인스턴스 유형에 따라 과금이 발생할 수 있습니다.

2. 스왑 공간을 추가해줍니다

인스턴스 유형을 확인하여 물리적메모리 양을 확인합니다

t2.micro, t3.micro → 1GB

스왑 공간은 물리적 메모리의 1배~2배가 적당합니다.

스왑 공간을 추가하는 방법은 두 가지입니다.

스왑 파티션을 생성하는 것과 스왑 파일을 생성하는 것

(스왑 파일을 생성하는 것이 상대적으로 유연한 대처법입니다)

2.1스왑 파티션 생성.

스왑 파티션 생성

1. ssh를 사용하여 인스턴스에 로그인 합니다.

2. 사용 가능한 볼륨을 나열합니다.

$ sudo fdisk -l

3. 목록에서 파티션 작업을 수행할 디바이스를 선택합니다.
/dev/xvda 는 예시입니다

$ sudo fdisk /dev/xvda

4. 새 파티션을 생성합니다.

\→ n

5. 파티션 유형을 선택합니다.

 \→ p

6. 파티션 번호를 할당합니다. 

\→ 2

7. Enter 를 눌러 기본값인 ‘First sector’를 승인합니다.

8. 스왑 파일의 크기를 입력합니다.
(RAM 2GB 가정) 생성한 파티션은 4GB(+4G로 지정)입니다.

\→ +4G

9. 저장 후 종료합니다.

\→ w

스왑 영역 설정

1. partprobe 명령을 사용하여 OS에 파티션 테이블 변경을 알립니다.

$ partprobe

2. 이전 단계에서 생성한 스왑 파티션을 사용하여 Linux 스왑 영역을 설정합니다.
(/dev/xvda2 는 이전 예시에서 만든 파티션입니다)

$ mkswap /dev/xvda2

3. 파티션을 스왑 공간으로 추가합니다.

$ sudo swapon /dev/xvda2

4. 현재 스왑 공간을 확인합니다.

$ sudo swapon -s
//출력예시
Filename      Type       Size     Used  Priority
/dev/xvda2    partition  4194300  0     -1

 

5. 재부팅한 후 다음 단계를 완료하여 스왑 메모리 할당을 영구적으로 설정합니다.

blkid 명령에서 UUID를 출력합니다.

$ sudo blkid

명령어를 입력하고 나온 출력에서 스왑 파티션의 UUID를 복사합니다.

vi, nano 와 같은 텍스트 편집기를 통해 /etc/fstab 파일에 다음을 추가합니다.

UUID=복사한UUID none swap SW 0 0

6. 파일을 저장한 다음 재부팅합니다. OS 재부팅 후 명령어를 사용하여,

free -h

스왑 메모리 할당이 지속되는지 확인합니다.

2.2스왑 공간을 추가해줍니다 - 스왑 파일 생성

1. 스왑 파일 생성

root 파일 시스템에 dd 명령어로 스왑 파일을 생성합니다.

명령어에서 bs는 블록 크기이고 count는 블록 수입니다.

스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱한 값입니다.

이러한 값을 조정하여 원하는 스왑 파일 크기를 결정합니다.

2GB(128MB x 16)

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

2.스왑파일의 읽기 및 쓰기 권한을 업데이트합니다.

$ sudo chmod 600 /swapfile

3.Linux 스왑 영역을 설정합니다

$ sudo mkswap /swapfile

4.스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 합니다.

$ sudo swapon /swapfile

5. /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 시작하도록 설정합니다.

편집기에서 파일을 엽니다.

$ sudo vi /etc/fstab

파일 끝에 다음 줄을 추가하고 파일을 저장한 다음 종료합니다.

/swapfile swap swap defaults 0 0

6. 재부팅 후, 프로시저가 성공적인지 확인합니다

$ sudo reboot
$ sudo swapon -s

4. 느낀점

EC2의 application.yml파일과 배포 스크립트 파일을 수정하면서 이 오류에 직면했습니다.

처음 직면 했을 때는 메모리 문제를 인지하지 못했습니다.

세 차례 오류를 맞닥뜨리면서 인스턴스 모니터링의 그래프들을 발견했습니다.

이상하게 치솟아 있는 것을 발견하고

구글링을 통해 메모리 문제일 수 있음을 알게 되었습니다.

직접 경험하지 않았더라면 놓칠 수 있는 부분이었습니다.

경험이 값지며, 잊지 않도록 공부하고 기록해야겠다고 느꼈습니다.

5. 참고자료

AWS 프리티어 참고사항: https://okky.kr/articles/884329 

스왑 파티션 생성: https://repost.aws/ko/knowledge-center/ec2-memory-partition-hard-drive

스왑 파일 생성: https://repost.aws/ko/knowledge-center/ec2-memory-swap-file

728x90