개발 일지 / / 2023. 6. 22. 19:21

EC2, 저사양 서버에서 스왑 메모리의 중요성

가난한 개발자라 학습 목적으로 AWS EC2 프리티어를 이용 중이다..

 

프리티어에서 무료로 제공되는 인스턴스의 램 용량은 1GB인데

글로벌 기업인 아마존은 서울에도 AWS 리전이 있어 응답이 매우 빠르고

서버 앱만 구동중일 땐 그동안 문제없이 잘 되서 램 용량을 간과하고 있었다..

데이터베이스도 EC2에 설치해 가볍게 사용할 생각으로

EC2에 Mysql을 설치하고 나서부터..

EC2가 켜지고 30분 이내로 먹통이 되는 문제가 발생했다.

 

아무리 요청을 보내도 응답이 오지않아서

ssh 및 세션 매니저를 통한 접속을 시도했지만

인스턴스에 접속조차 불가능 했고 아예 묵묵부답이었다.

 

인스턴스를 재시작한 직후 서버를 구동시키고 메모리 사용량을 조회해보니

여유 메모리의 용량이 71MiB밖에 되지 않았다.

1MB는 1000KB이지만 1MiB는 1024KiB 또는 1048.576KB이다. 즉, 남은 메모리 공간이 74메가바이트를 조금 넘긴 정도밖에 없었다.

이 상황에서 Mysql까지 구동하려니 메모리 부족으로 멈춰버린 것 같다..

이를 해결하기 전에 먼저 설명해야할 것이 있다.

 

컴퓨터의 각 부품의 동작과 자원을 효율적으로 관리하기 위해서는 운영체제가 반드시 필요한데

운영체제가 프로세스와 메모리 공간을 관리하기 위한 기법 중의 하나로

가상 메모리라는 것이 있다.

 

본래 가상 메모리는 가상의 메모리 주소를 프로세스에 할당하는 것이고

메모리 용량이 확장되는 것은 아니다.

 

하지만 스왑을 이용한다면 보조 기억 장치의 공간 일부를

마치 메모리처럼 사용할 수 있다.

 

프로그램이 실행되려면 물리 메모리에 적재되어야 하지만

프로그램의 필요한 부분만을 메모리에 적재하고

나머지 부분은 보조 기억 장치에 저장하는 방식을 이용해 구현된다.

 

보조 기억 장치의 특징과 한계를 생각해보면

물리적 메모리에 접근하여 읽고 쓰는 속도보다는 느릴 수 밖에 없겠지만

물리적 메모리 용량이 부족할 때야말로 빛을 발휘하는 기술이다!

 

가상 메모리로 쓰이는 보조 기억 장치의 공간을

스왑 공간 혹은 스왑 메모리라고 부르게 되는데

이 스왑 메모리 덕분에 램 용량 부족 현상을 해결할 수 있다.

(스왑 메모리님 감사합니다..)

 

AWS 공식 사이트에서 스왑 메모리를 설정하는 방법에 대해

설명하는 게시물을 찾을 수 있었는데

 

디스크 공간의 일부를 스왑 메모리용 파티션으로 분할하는 방법

파일의 형태로 스왑 공간을 확보하는 방법이 있었다.

 

후자의 방법이 더 간단해 보여서 시도했다.

 

1. 우선 스왑 공간을 확보하기 위한 파일을 생성해야 한다.

# bs = 블록 크기, count = 블록 수, 스왑 파일의 크기 = bs * count
# 블록 크기는 인스턴스에서 사용 가능한 메모리보다 작아야 한다. 그렇지 않으면 "memory exhausted" 오류가 발생한다.
# 예제에서 스왑 파일의 크기는 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. 성공했는지 확인한다.

$ sudo swapon -s

6. /etc/fstab 파일을 편집하여 부팅 시 스왑 파일을 시작한다.

# 편집기로 fstab 파일을 연다.
$ sudo vi /etc/fstab

# 파일 끝에 다음 내용을 추가하고 저장한 다음 종료한다.
/swapfile swap swap defaults 0 0

7. free 명령어로 메모리 사용량을 확인한다.

게시물에서는 2GB라고 되어있었지만 2GiB로 나온다.

스왑 메모리가 잘 사용되는 것을 확인했다.

 

이제 Mysql과 다른 프로그램을 추가로 실행해도 인스턴스가 멈추지 않는다!

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유