본문 바로가기

TIL(Today I Learned)

TIL-231109(Swap Memory)

📝오늘 공부한 것

  • '행동대장' JMeter 테스트
  • Swap Memory 공부하기
  • 커리어톤 참여
  • 프로그래머스 문제풀기

📌 Swap Memory

부트캠프에서 프로젝트를 진행했을 때, 실제로 만든 서비스를 배포하고 유저피드백을 받았었다.
서버비 부담으로 인해 AWS 프리티어를 사용하였다.
그러다보니 프리티어인 t2.micro는 RAM이 1GB밖에 되지 않아 서버가 다운되는 문제가 발생하였었다.
아무도 서버를 사용하지 않은 채 기다려도 CPU 사용률이 낮아지지도 않고, SSH를 접속하려해도 접속이 되지 않아 당황했었다. 심지어 유저피드백을 앞두고 있어서 서버가 또 터지면 어떡하지?하는 고민이 있었다.

Scale Up을 하기에는 서버비가 부담이 되어 스왑메모리를 사용하였다.
그때는 'ec2를 사용할 때 서버가 터지면 swap memory를 사용하면 되는구나'만 알고 넘어갔었는데, 스왑메모리를 사용할 때 적절한 크기와 시기가 있다는 걸 알고 다시 공부해보려고 한다.

 

📍 하드디스크와 RAM

하드디크스 - 보조기억장치  /   RAM - 주기억장치

컴퓨터에 설치된 프로그램은 모두 하드디스크에 저장되어 있다. 프로그램을 실행하면 관련 데이터가 하드디스크에서 RAM으로 옮겨지게 된다. 이후 프로그램을 관련된 데이터를 처리하는 일은 CPU의 역할이다.

결국 RAM은 CPU가 처리해야하는 데이터가 임시적으로 저장된 곳이다. 즉 실질적으로 프로그램을 실행하면 CPU는 RAM에 들어있는 데이터를 읽어와서 처리한다. RAM에서는 하드디스크에 저장된 데이터의 일부를 복사해서 저장하며 필요에 따라 CPU로 전달하는 역할을 수행한다.

이후 RAM에 용량이 가득차게 되면 데이터 손실이 일어나거나 여러 문제나 시스템에러가 생길 확률이 높다. 이를 방지하기 위해서 swap 메모리영역을 사용한다.

 

📍 Swap Memory

스왑메모리는 하드디스크의 일정 부분을 메모리 공간 부족시 메모리처럼 사용하기 위해 설정해둔 공간이다.

물리적인 메모리 RAM은 CPU가 처리하는 데이터가 임시저장되는 공간이다. 스왑은 만약 프로그램 용량이 커서 RAM에 수용할 수 있는 용량을 초과하는 경우를 대비하여 예비공간의 역할을 수행한다고 보면 된다.

커널은 실제 메모리에 올라와 있는 메모리 블록들 중에서 당장 쓰이지 않는 것을 디스크에 저장하여, 사용 가능한 메모리 영역을 늘린다. 또한 메모리에 있는 데이터 중 최근 자주 사용되지 않은 데이터를 SWAP 공간으로 이동시킨다.

그리고 SWAP으로 옮겨진 데이터를 프로세스가 읽기 위해 메모리로 데이터를 다시 가져온다. 이는 디스크로부터 옮겨 졌던 데이터를 다시 메모리로 가져오기 때문에 레이턴시가 길어져 결국 성능 저하로 이어진다.

즉, 속도면에서는 실제 메모리가 아닌 하드디스크를 이용하는 것이기 때문에 메모리 속도면에서는 현저히 떨어진다고 할 수 있다.

따라서, 일시적인 메모리 사용 증가로 일정 SWAP을 사용하는 상황과 지속적인 메모리 부족으로 인해 SWAP이 커지는 경우를 지속적으로 모니터링하여 메모리 증설 시점을 고려해야 한다.

 

실제 디스크 공간을 메모리처럼 사용하는 개념이기 때문에 가상 메모리라고 할 수 있다.

그러나 가상 메모리는 아니고 그 일부이다.

가상 메모리 스왑 공간
가상 메모리는 RAM뿐만 아니라 디스크 메모리의 일부도 보유합니다 스왑 공간은 보조 디스크에 위치하며 가상 메모리의 일부입니다.
가상 메모리는 메모리를 정리하고 공간 문제를 해결합니다. RAM이 가득 차면 OS는 비활성 프로세스와 덜 사용되는 프로세스를 공간을 교환하기 위해 이동합니다.
데이터는 OS가 메모리에서 직접 읽고 씁니다. OS는 메모리에서 직접 데이터를 읽거나 쓰지 않습니다.

 

 

📍 스왑파일을 사용하여 EC2 인스턴스에서 스왑 공간으로 사용할 메모리를 할당하는 방법

물리적 RAM을 이미 사용하고 있을 경우 Amazon EC2 인스턴스는 물리적 RAM에 대한 단기 교체로 스왑 공간을 사용한다.

활성 상태가 아니거나 다른 데이터 또는 긴급히 필요하지 않은 RAM의 콘텐츠를 스왑 파일에 페이징할 수 있다. 그러면 RA을 확보하여 즉시 사용할 수 있다.

 

메모리를 스왑 공간으로 할당하려면

1. 스왑 공간 크기를 계산한다.

2. 하드 디스크에 스왑 공간으로 파티션을 생성한다.

3. 스왑 영역을 설정한다.

 

인스턴스는 RAM 용량이 가득 차면 스왑 공간을 사용한다. 스왑 공간은 RAM 용량이 적은 인스턴스에 사용 가능하지만 더 많은 RAM을 대체하지 못한다. 스왑 공간이 인스턴스의 하드 드라이브에 있기 때문에 실제 RAM에 비해 속도가 느려진다. 더 많거나 더 빠른 메모리를 원하면 인스턴스 크기를 늘려야한다.

 

📍 스왑 공간 크기 계산

물리적 RAM이 최대 2GB인 경우, 물리적 RAM의 2배에 해당하는 스왑 공간을 확보하는 것이 가장 좋다. 용량이 2GB를 초과하는 경우, 물리적 RAM 1개를 추가해야한다. 또한, 스왑 공간은 32MB 이상인 것이 가장 좋다.

시스템 RAM 용량 권장 스왑 공간
2GiB 이하의 RAM RAM 용량의 2배이지만 32MB보다 작으면 안 됨
2GiB 이상의 RAM이지만 64GiB 미만 RAM 용량의 0.5배
64GiB 이상 워크로드 또는 사용 사례에 따라 다름

 

 

ec2서버가 메모리부족으로 다운되었을 때 swap memory를 사용하는 것은 임시방편으로 완전히 해결한것이라고 볼수 없다는 것을 알았다. 또한, swap memory를 사용했을 때 속도가 느려진다는 것도 알게 되었다. 프로젝트를 진행했을때는 서버비로 인해 swap memory를 사용했었지만, 실제 서비스일 경우에는 Scale Out을 하는 것이 가장 안전한 방법처럼 보였다.

 

 

 

 

 

 

 

 

 

 

References :

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

https://repost.aws/ko/knowledge-center/ec2-memory-partition-hard-drive

https://www.whatap.io/ko/blog/37/

https://wiseworld.tistory.com/62

https://develoid.github.io/linux/Linux-Swap-Memory.html

https://www.atatus.com/blog/what-is-swap-space/#swap-space

https://www.baeldung.com/cs/virtual-memory-vs-swap-space