과정을 즐기자

가상 메모리를 사용하여 서버의 부족한 RAM 해결하기 본문

DevOps

가상 메모리를 사용하여 서버의 부족한 RAM 해결하기

320Hwany 2023. 5. 11. 17:53

마주친 문제

프로젝트를 진행하면서 서비스를 배포하기위해 클라우드 서비스인 AWS EC2를 사용하였습니다.

스크립트를 만들고 gradle build를 하는데... 배포 도중 멈춤현상이 발생하였습니다.  

실행을 중지하려고 해도 잘 되지 않았습니다. 결국 EC2를 종료하고 다시 시작하기를 반복하였습니다.  

검색을 해보다가 대여한 EC2가 프리 티어이기 때문에 RAM을 1GB만 사용해서 메모리 부족현상이라는

사실을 알게되었습니다. 

 

 

가상 메모리

운영체제가 하는 대표적인 역할 중 하나가 메모리 관리입니다.

컴퓨터 내의 한정된 메모리를 효율적으로 사용해야 합니다.

가상 메모리는 메모리 관리 기법 중 하나로 컴퓨터가 실제로 이용 가능한

메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말합니다.

 

물리 메모리(RAM) + swap 공간 (디스크 공간) => 가상 메모리

 

이렇게 사용하는 이유는 무엇일까요?

 

일반적으로 램이 1GB라면 1GB 이하의 프로그램을 실행할 수 있습니다.  

프로그램의 코드와 데이터가 모두 RAM에 로드되어 실행되어야 하기 때문입니다.

이때 가상 메모리를 사용하여 하드 디스크의 2GB를 스왑 공간으로 사용하여 총 3GB를 RAM 처럼 사용할 수 있습니다.

이렇게 함으로써 부족한 RAM으로 용량이 큰 프로그램을 실행할 수 있는 것입니다.

 

AWS EC2 인스턴스에서 스왑 공간으로 활용할 메모리 할당하기

AWS 공식 문서를 살펴보겠습니다.

 

https://repost.aws/ko/knowledge-center/ec2-memory-swap-file

 

스왑 파일을 사용하여 Amazon EC2 인스턴스의 스왑 공간으로 메모리 할당

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 스왑 파일로 사용할 메모리를 할당하려고 합니다. 어떻게 해야 하나요?

repost.aws

 

1. 스왑 파일 생성

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

RAM 1GB 이상인 경우에 스왑 공간의 용량은 RAM 크기의 2배를 권장합니다.

따라서 128 * 16 = 2048,  2GB를 할당해줍니다.

 

2. 읽기 쓰기 권한 업데이트

sudo chmod 600 /swapfile

 

3. 리눅스 스왑 영역 설정

sudo mkswap /swapfile

 

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

sudo swapon /swapfile

 

5. 프로시저 성공 확인

sudo swapon -s

 

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

sudo vi /etc/fstab

 

편집기 안으로 들어간 후 맨 아래에 다음 줄을 추가한 후 저장합니다.

/swapfile swap swap defaults 0 0

 

이제 free 명령어를 사용하여 스왑 공간이 할당되었는지 확인해보겠습니다.

Swap의 total 부분이 2097148로 2GB 정도가 할당되었습니다.

 

이제 서비스를 배포한 후 다시 free 명령어로 확인해보겠습니다.

 

Swap의 used를 보면 14336 즉 14MB 정도의 스왑 공간을 사용했다는 것을 확인할 수 있습니다.

 

정리 

스왑 공간을 이용하여 부족한 RAM으로 인해 발생하는 문제를 해결하였습니다.

하지만 이러한 스왑 공간을 할당하는 것은 성능상 문제가 발생할 수 있습니다.

가상 메모리에는 존재하지만 실제 메모리인 RAM에는 존재 하지 않다면 페이지 폴트가 발생하기 때문입니다.

이러한 페이지 폴트가 빈번하게 발생한다면 스와핑이 여러번 일어나 성능상 문제가 발생할 수 있습니다.

성능을 끌어올리려면 RAM의 용량을 늘려야 하겠지만 비용상의 문제로 계속 Scale Up을 할 수는 없습니다.

이번에 이러한 문제를 겪으면서 한정된 자원 안에서 해결할 수 있는 방법을 배웠습니다.