EC2에서 메모리가 부족할 땐 가상 메모리 기법을?

윤학·2023년 3월 23일
3

Linux

목록 보기
2/2
post-thumbnail

가상 메모리가 왜 필요하나요?

현재 AWS EC2의 t2.micro 인스턴스 유형을 쓰고 있다 보니 빌드하다 보면 너무 느려져서 먹통이 되는 경우가 많다.

인스턴스 유형을 더 좋은 걸로 변경해도 되지만 그만큼 돈이니 디스크에 충분한 여유 공간이 남는다면 가상 메모리를 활용해서 메모리 부족 현상을 해결할 수 있다.

하지만 이것 역시 하드디스크의 일부를 쓰는 것이기 때문에 속도면에서나 용량면에서 계속해서 메모리가 부족하다면 메모리를 늘리는 것이 맞다.

가상 메모리? 스왑공간? 뭐가 다른거죠?

내가 공부한 바로는 가상 메모리는 메모리 관리 기법 중 하나이며 디스크를 RAM의 확장처럼 사용하는 개념인데 이 때 디스크에서 사용되는 공간을 스왑 공간이라고 하는 것이다.

어떻게 동작하는 건가요?

그래서 미리 디스크의 일부를 스왑 공간으로 설정을 해 현재 메모리에서 덜 사용되거나, 사용되지 않고 있는 페이지를 스왑 공간으로 복사를 해두어서 메모리를 비우는 프로세스를 스와핑이라 하는데, 이 과정을 통해서 내가 어떤 작업을 할 때 메모리가 부족하다면 비워진 메모리를 내가 사용할 수 있는 것이다.

Ubuntu에서 스왑 공간을 파티션과 파일 2가지 중 하나로 설정할 수 있는데 2가지 명령어를 통해 파일을 생성하고 스왑 공간을 설정해보자!

그럼 시작!!

현재 나의 메모리와 디스크 상태는 아래와 같다.

1. 스왑 파일 생성

1) dd 명령어

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

위 명령을 수행하면 null 문자로 채워진 2G의 swapfile을 루트 밑에 만든다.

나는 AWS에서 권장하는 스왑 용량으로 설정을 하였고, bs는 한번에 읽을 블록 크기인데 인스턴스에서 사용 가능한 메모리보다 크다면 오류가 발생한다고 하니 알맞게 설정하자.

2) fallocate 명령어

sudo fallocate -l 2G /swapfile
위 명령어도 dd 명령어와 같이 루트 밑에 2G의 스왑 파일을 만든다.

근데 속도차이가...?

이 두가지 명령을 해보면 속도차이가 확연히 나는 것을 알 수 있다.

나의 경우 압도적으로 fallocate 명령어가 빨랐는데 그 이유는 dd 명령어는 /dev/zero로부터 읽어서 파일을 쓰는데 스왑 파일 생성시에 널 값으로 전부 채우기 때문이라고 한다.

반면 fallocate는 설정한 공간만큼 할당만 해두고 따로 쓰는 작업이 없기 때문에 빠르다고 한다.

2. 스왑 파일의 권한 설정

처음 스왑 파일을 만들고 스왑 영역을 설정하려 하면 권한 관련 오류가 날 것이다.

권한의 보안이 적절하지 않다는 얘기인데 루트 사용자만이 읽고 쓸 수 있도록 변경해준다.

sudo chmod 600 /swapfile

chmod 명령어를 통해 파일의 권한을 변경해 줄 수 있는데 chmod에 대한 설명은 너무 잘 나와 있으므로 여기선 패스

3. 스왑 영역 설정

sudo mkswap /swapfile

아까 권한 문제로 실패했던 명령을 다시 입력해 스왑 공간을 설정해준다.

mkswap 명령어는 지정한 파일이나 파티션에 스왑 공간을 설정하도록 해주는 명령어다.

4. 스왑 영역 활성화

sudo swapon /swapfile

이전에 mkswap 명령어로 설정한 스왑 공간을 swapon 명령어로 활성화 시켜 사용할 수 있게 한다.

5. 재부팅시 설정

재부팅시에 자동으로 활성화 되지 않는다고 하여 인스턴스를 재부팅 시켜보았더니 스왑 공간은 설정되어 있는데 활성화가 되어 있지 않다.

만약에 재부팅을 해도 자동으로 활성화 되길 원한다면 /etc/fstab파일에 다음을 추가 해주어야 한다.
/swapfile swap swap defaults 0 0

  • /swapfile: 파일 시스템 장치명
  • swap: 마운트 포인트를 적어야 하는데 특정 마운트 지점이 없으므로 아무 이름을 적어도 된다 한다. 관례상 none이나 swap을 사용한다.
  • swap: 파일 시스템 종류로 ext4, xfs, swap등이 올 수 있다.
  • defaults: 파일 시스템의 용도에 맞게 속성을 설정하는 옵션으로 rw, suid, dev, exec, auto, nouser등의 속성을 모두 가진다고 하는데 여기에서 자세하게 확인 가능하다.
  • 0: 백업 유틸리티 덤프가 파일 시스템을 백업할지를 설정하는 필드인데 1인 경우에만 백업하며 대부분의 경우 0으로 설정을 한다.
  • 0: 부팅 시 파일 시스템을 검사할지를 설정하는 필드인데 0인 경우에는 검사를 하지 않고 루트 파티션에만 1을 사용하고 나머지는 2를 사용하도록 권장하고 있다.

6. 스왑 영역 비활성화 및 삭제

만약 스왑 공간을 사용하지 않아 비활성화 시키려 하면 swapoff 명령어로 간단히 비활성화 시킬 수 있다.

여기서 재부팅을 하고도 자동 활성화를 끄려면 /etc/fstab파일에 추가한 /swapfile 항목을 삭제해주면 된다.

비활성화를 한다 해도 스왑 공간은 할당이 그대로 되어 있기 때문에 용량은 그대로일 것이다.

삭제까지 원한다면 단순히 rm 명령어로 스왑 파일을 삭제 가능하고 할당하는데 사용한 용량도 그대로 다시 복구가 된다.

마치면서...

스왑 파일을 통해서 디스크의 일부를 메모리로 사용하면서 메모리 부족현상을 없앨 수는 있어 사용해볼만 한 방법이다.

하지만 속도가 엄청 중요하거나 장기적인 관점에선 완벽한 해결법은 아닌 듯 하다.

추후에는 파일이 아닌 파티션으로 스왑 영역 설정하기, /etc/fstab 파일에 장치명을 UUID나 LABEL로 대신하기 정도를 시도해보고 싶다.

참고

How to allocate memory to be used as swap space on an Amazon EC2 instance using a swap file?
How do I use a partition on my hard disk to allocate memory to be used as swap space on my Amazon EC2 instance?
Introduction to fstab
/dev/zero 위키피디아
Differenct between "none" and "swap" as a mountpoint for swap in fstab?

profile
해결한 문제는 그때 기록하자

1개의 댓글

comment-user-thumbnail
2024년 2월 10일

덕분에 좋은 정보 잘 보고 갑니다.
감사합니다.

답글 달기