EC2 Swap memory 설정

정비호·2024년 4월 29일

Troubleshooting

목록 보기
2/8

이전에 진행하던 프로젝트가 슬슬 배포를 준비하는 단계에서의 일이었다. 메모리가 부족해서 EC2가 계속 터져버리는 일이 있었는데 어떻게 해결했는지에 대해서 기록해본다.

발단

때는 프로젝트의 배포 단계를 준비할때 일어났다.
당연히 production 환경 서버에 코드 변경 사항을 개발할때처럼 바로바로 제대로 된 테스트 없이 밀어 넣어서 그때마다 계속 서버를 재실행 시키는건 말이 안됐기 때문에 production 환경과 development 환경의 서버를 분리 시키기로 했다.
그리고 production 서버는 AWS의 RDS를 통해 MySQL의 DB 인스턴스를 생성하고 연결 시켜서 사용했는데 development 환경에서의 DB는 그럴 이유도 없고 돈낭비라는 생각이 들어서 Docker를 통해 MySQL의 이미지로 컨테이너를 띄워서 연결시키기로 했다.

문제 발생

컨테이너를 띄우기 전까지는 참 좋았다. 서버와 MySQL 이미지의 실행 및 설정을 위해 docker-compose 파일을 작성했고 컨테이너를 띄웠다.
그리고 우리의 EC2 인스턴스는 다시는 일어나지 못했다.

EC2 메모리 확인

free -h 명령어를 사용한 모습.
사진에서는 swap memory가 이미 할당 되어 있다.

EC2 인스턴스의 메모리는 1GB 정도였고, MySQL과 서버가 컨테이너로 돌기 시작하는 순간 서서히 먹통이 되더니 결국 메모리가 부족해져 감당하지 못하고 인스턴스가 다운되어 버리는 것이었다.

그래서 나는 구글링 끝에 해결 방법을 찾았다.

문제 해결

swap memory

인터넷을 좀 뒤져 보니 swap memory를 할당하면 해당 문제를 해결할 수 있다더라.. 일단 swap memory가 뭔지부터 알아보면

실제 디스크의 용량을 이용하여 부족한 메모리를 대체할 공간을 swap memory(스왑 공간)이라 한다.

이제 본격적으로 swap memory를 할당해보자. 먼저 swapfile을 생성해야 하는데 나처럼 램이 1GB인 경우엔 2배 이상을 추천한다고 한다.
나는 이전 사진에서 봤다 싶이 2GB로 설정했다.

sudo dd if=/dev/zero of=/swapfile bs=128M count=16
  • dd: 블록 단위로 파일을 복사하거나 파일 변환을 할 수 있는 명령어
  • if: 지정한 파일을 입력 대상으로 설정
  • of: 지정한 파일을 출력 대상으로 설정
  • bs: 한 번에 변환 작업 가능한 바이트 크기
  • count: 지정한 블록 수만큼 복사

'bs랑 count는 뭐여 그래서 2GB를 어떻게 할당한건데?'
싶으면 대충 128 * 16을 해보면 2048이니까 2GB 나오는구나. 하고 이해하면 된다. 4GB 만들고 싶으면 count에 32를 주면 된다.

이제 아래의 명령어를 쭉 따라가면 된다.

swapfile의 읽기/쓰기 권한 설정

sudo chmod 600 /swapfile

스왑 공간 추가

sudo mkswap /swapfile

스왑 메모리 추가

sudo swapon /swapfile

여기까지만 문제가 없었다면 성공적일 것이다. 확인해보고 싶으면 free -h 명령어와 sudo swapon -s 명령어로 시스템 사용 가능 메모리 공간을 확인, 스왑 생성 확인을 해보면 된다.
전혀 어렵지 않다. 하지만 EC2 인스턴스를 재부팅하면 다시 초기화 된다.
재부팅 후에도 다시 스왑 파일이 자동으로 활성화 될 수 있도록 파일 시스템을 수정하자.

파일 시스템 수정

이번에도 간단하다.

sudo vi /etc/fstab

맨 끝줄에 /swapfile swap swap defaults 0 0를 추가해주면 끝이다.

출처:

profile
잘하고 싶은 개발자

0개의 댓글