AWS EC2 스프링 배포 중 멈춤(스왑 공간 추가)
1. 오류원인
리눅스는 물리적인 메모리, RAM(Random Access Memory)을 페이지(메모리 조각)로 나눕니다.
(리눅스에서 가용한 가상 메모리의 양은 RAM과 스왑 공간을 더한 것입니다)
만약 물리적인 메모리(RAM)의 용량이 가득 차게 될 경우,
시스템이 충돌하여 정지될 수 있습니다.
EC2 인스턴스를 프리티어로 만든 경우, 물리적인 메모리의 용량이 작아서
응용 프로그램을 가동 중 정지할 수 있습니다.
2. 오류내용
EC2가 정지했습니다.
ssh가 작동을 하지 않습니다.
인스턴스 모니터링의 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