가상 메모리 정리 + EC2 서버 스왑 설정

옹심이·2025년 1월 4일
0

시작하며

최근에 서버가 다운되는 문제가 자주 발생했다. 현재 사용 중인 프리티어 인스턴스는 메모리가 1GB로 제한되어 있기 때문에 이를 보완해 더 안정적으로 운영을 하기 위해 스왑 설정을 해주기로 했다. 설정 자체는 구글링해서 하라는데로 따라하면 쉽게 할 수 있지만, 실제로 내가 사용하는 명령어가 어떤 동작을 하는지 알고 싶기도 하고, 이참에 가상 메모리에 대해 제대로 공부해보고자 포스트를 작성하게 되었다.

가상 메모리 정리

개요

가상 메모리를 검색하면 항상 나오는 말이 있다. ‘더 많은 메모리를 사용하는 것처럼’. 이게 어떻게 가능한 것일까? 가상 메모리는 컴퓨터의 메모리를 추상화 해 페이지라는 최소 단위로 메모리를 관리한다. 가상 메모리 내에서 하나의 프로세스는 무조건 0번지 주소부터 시작하는 가상 주소를 할당받는데 이는 모든 프로세스에게 적용된다. 따라서 각 프로세스는 물리 메모리의 존재를 모르며 자신 만의 가상 메모리만 알고있다.

우리가 만약 32bit 컴퓨터를 사용한다면 가상 메모리는 하나의 프로세스에게 2GB씩 나누어 준다. 하지만 메모장만 실행 시키는데 2GB를 전부 사용하지는 않을 것이다. 따라서 프로세스가 할당될 때 프로세스가 사용하는 가상 메모리 영역 만큼만 물리 메모리를 사용하도록 매핑 해준다. 이렇게 가상 메모리와 물리 메모리 사이에서 메모리 관리를 주 업무로 하는 중간 관계자를 메모리 관리자라고 한다.

가상 메모리가 없던 시절

가상 메모리가 없던 30년전에는 OS와 어플리케이션이 같은 레이어에서 동작했다. 램의 앞 부분을 OS가 사용하고 남은 영역에서 어플리케이션을 사용하는 구조로 동작했다. 프로그램을 실행할 때 메모리를 나눠 사용하는 것은 맥락상 같지만 한 번에 하나의 프로그램만 실행할 수 있었다.

유저 영역, 커널 영역 개념이 없었기 때문에 작은 문제가 발생해도 프로그램 하나의 영향으로 인해 시스템 전체에 문제가 발생했다. 따라서 실행 중인 프로그램에 오류가 발생하면 커널이 프로그램에 할당된 메모리를 할당 해제해 재활용할 수 없었고 반드시 재부팅을 해야만 다시 정상으로 돌아왔다.

가상 메모리의 탄생으로 이러한 문제로부터 자유로워질 수 있게 되었다. 가상 메모리는 이를 어떻게 보완할 수 있었을까?

가상 메모리의 역할

가상화된 주소 체계가 각 프로세스에 할당되어 있으며 실제 사용하는 영역에 대해 물리 메모리로 매핑이 일어나 공간을 보다 효율적으로 사용할 수 있으며 중간에는 커널의 메모리 관리자가 있음을 알 수 있었다.

가상 메모리는 무엇보다 독립된 가상 주소 공간을 사용한다는 것이 가장 중요하다. 이 말은 각 프로세스의 가상 주소는 물리 메모리에서 분리된 영역으로 관리됨을 의미한다. 따라서 물리적 메모리에 실제로 접근하는 것이 불가능하기 때문에 다른 프로세스의 데이터에 침범할 수 없게 된다.

메모리 관리자는 프로그램에 오류가 발생하였을 때 이를 인지하여 매핑 테이블에서 매핑 정보를 삭제하고 물리 메모리에서 해제 시켜 다른 프로세스가 사용할 수 있도록 처리해 시스템을 정상화 시킬 수 있다.

이를 통해 하나의 프로그램이 시스템에 미치는 영향을 최소화 할 수 있게 되었다.

스왑 공간

새로운 데이터를 메모리에 로드하려고 할 때 물리 메모리의 공간이 가득 차 있다면, 할당이 불가능하다. 이 때 페이지 교체와 스왑 공간 활용으로 이를 해결할 수 있다.

페이지 교체는 새로운 페이지를 로드하기 위해 기존의 물리 메모리 페이지 중 하나를 제거하는 과정이다. 이 때 교체 알고리즘을 사용해 페이지의 우선순위를 계산하며 스왑 공간도 사용될 수 있지만 물리 메모리 위주로 실행된다.

스왑 공간은 물리 공간을 사용할 수 없을 때 보조로 사용하는 디스크 공간(그림의 오른쪽)의 일부이다. 물리 공간에서 자주 사용되지 않는 페이지를 스왑 공간에 저장하는 swap-out을 통해 물리 메모리의 여유를 확보할 수 있다. 따라서 가용할 수 있는 공간이 물리 메모리 + 스왑 공간으로 늘어나는 것이다. 하지만 이는 디스크 I/O 기반으로 동작하기 때문에 물리 메모리보다 훨씬 느리다는 단점이 있다.

swap-out 이후 스왑 공간에서 사용중이던 페이지를 다시 물리 메모리에서 사용하기 위해 물리 메모리로 이동 시키는 것을 swap-in이라고 한다.

EC2 서버 스왑 설정 실습

이제 서버가 스왑 공간을 활용할 수 있도록 설정해줄 것이다.

1. 현재 스왑 공간 확인

우분투 서버에서 현재 스왑 공간 상태를 확인한다

sudo swapon --show

출력 내용이 없으면 스왑 공간이 설정되어 있지 않은 상태이다

2. 디스크 공간 확인

스왑 파일을 만들기 전에 디스크에 충분한 여유 공간이 있는지 확인한다

df -h

3. 스왑 파일 생성

스왑 파일을 생성하고 크기를 지정한다. 나는 2GB의 스왑 파일을 생성했다

sudo fallocate -l 2G /swapfile

참고: fallocate가 지원되지 않는 경우 대신 dd 명령을 사용할 수 있다

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

4. 파일 권한 설정

스왑 파일의 권한을 수정하여 보안을 강화한다

sudo chmod 600 /swapfil

5. 스왑 파일로 설정

생성한 파일을 스왑 공간으로 설정한다

sudo mkswap /swapfile

6. 스왑 활성화

스왑 파일을 활성화한다

sudo swapon /swapfile

활성화된 스왑 상태를 다시 확인한다

sudo swapon --show

7. 스왑을 영구적으로 설정

서버가 재부팅되더라도 스왑 공간이 유지되도록 설정하려면 /etc/fstab 파일에 스왑 파일을 추가해야 한다

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

8. 스왑 공간 확인

스왑 파일이 올바르게 설정되었는지 확인한다

free -h

0개의 댓글