컴퓨터구조 & OS

[가상메모리:SWAP] 건드리면 터지는 2GB 서버에 서비스올리기

히어로맛쿠키 2024. 4. 27. 12:33

✨ 가상 메모리

어떻게든 올려야 한다면 가상메모리(swap)를 고려해볼 수 있다!

물리적 RAM이 부족할 때 디스크 공간의 일부를 RAM처럼 사용할 수 있게 하는 시스템이 가상메모리이다. 스왑 영역을 늘린다는 것은, 우리 서비스 프로세스에 필요한 페이지를 RAM에 다 못올리니까 보조기억장치(스왑영역)에 적재해두겠다는 것이다. RAM이 작으니까 페이지 폴트가 무지하게 발생하는 것이므로... 디스크의 스왑 영역을 빈번하게 참조(read, write)하게 된다. 결국 디스크  I/O 연산이므로 CPU 부하를 증가시킨다.

 

이 방법은 잠시 서비스를 돌리기 위한 임시 방편이다.

우리 팀이 지원받고 있던 서버가 종료되어서..

임시로 2GB 클라우드 서버 만들어서 올려두기로 했기 때문이다 (잠시!)

 

 

✨ 스왑 용량 늘리기

시작해보자!

그 전에... 아래 글이 큰 도움이 되었다. 감사합니다.

https://pat.im/1286

 

[리눅스] 스왚 파일을 만들어 시스템 메모리에 붙이기

(1) 스왚 메모리로 쓸 파일을 디스크에 할당하기 $ sudo dd if=/dev/zero of=/swapfile bs=1M count=10241024+0 records in1024+0 records out10737418...

pat.im

 

 

🪄 현재 스왑파일 확인

swapon 명령으로 스왑파일이 존재하는지 확인할 수 있다.

sudo swapon --show
또는
sudo swapon -s

 

현재 스왑파일이 없는 상태다. 스왑을 사용하지 않는 상태로, 빈 리스트를 가진다.

아무 것도 뜨지 않는다.

 


 

🪄 스왑파일 생성하기

CentOS가 되느냐 되지 않느냐의 발견을 하신 분의 링크를 첨부한다. 도움을 많이 받았다.

https://shanepark.tistory.com/378

 

Linux) 스왑(swap) 메모리 설정 변경

Intro 메모리 부족 Windows 에서는 WSL 위에 도커 컨테이너 몇개 띄우고, 인텔리제이에 브라우저 탭 몇개만 켜면 메모리가 바닥나버리는 바람에 Linux 사용을 시작한지도 어느덧 1년이 다 되어갑니다.

shanepark.tistory.com

 

 

▶ CentOS가 아닌 경우

8기가짜리 스왑파일을 생성하기 위한 명령은 다음과 같다.

fallocate 명령어를 사용한다.

sudo fallocate -l 8G /swapfile

 

 

 CentOS인 경우

위 방법에서는 fallocate 명령을 통해 스왑파일을 생성하였는데, sudo swapon /swapfile 명령어 수행시  swapon: /swapfile: swapon failed: Invalid argument   에러가 발생하다. CentOS는 안된다고 한다 (나도 안되는 것을 경험함)

만약 이 오류를 만났으면 스왑파일을 지우고, 처음부터,

 

아래 명령어를 사용해서 스왑파일을 생성하자. 

8기가 스왑파일 생성할 거라면 다음과 같다.

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

 

∨ 명령어 이해하기:

- 1GB 크기의 스왑파일을 만들고 싶으면, 1MB × 1024 설정을 해야 한다. 블록사이즈 block size 즉 bs=1M으로 지정되어야 하고, 처리할 블록의 개수 count=1024 또는 count=1M라고 지정한다. 그러면 1MB 사이즈의 블록을 1024번 작성하게 되어, 총 1GB 짜리 스왑파일을 만든 것이다.

- 스왑파일 크기는 최소 40KB (40960bytes)는 되어야 한다고 한다.

- if=/dev/zero라는 설정은, 입력파일로 /dev/zero를 사용한다는 건데, 이 /dev/zero파일은 무한히 0을 출력하는 특수 파일이다. 그다음 of=/swapfile은 출력파일의 경로를 지정하는건데, 우리는 스왑파일을 생성할 것이므로 스왑파일의 경로를 적어주면 된다.

dd 명령어를 통한 스왑파일 생성!

 

 

 


🪄 스왑파일 생성 이후 작업

 

[1] 권한 변경

sudo chmod 600 /swapfile

 

루트 사용자만 스왑파일에 write 가능하도록 권한 변경해야 한다.

접근 권한을 변경하지 않으면, 이후에 스왑파일을 메모리에 올리는 작업에서 권한 오류가 난다. 

 

 

 

 

[2] 방금 만든 스왑파일을 스왑공간으로 설정하기

mkswap 유틸리티를 이용해 해당 파일을 리눅스 스왑공간으로 설정해야 한다.

우리가 좀전에 생성한 /swapfile이라는 파일을 스왑 영역으로 초기화하여, 해당 스왑파일을 스왑공간으로 인식하고 사용할 수 있게 된다.

sudo mkswap /swapfile

 

그러면 Setting up swapspace ... 라고 뜨면서 UUID도 부여되고 스왑공간이 세팅된다.

다음 사진처럼.

 

이 UUID는 부팅시스템에 등록하여 설정을 유지하고자 할 때 필요할수도, 필요하지 않을 수도 있다.

설정에 등록할 때, 리눅스 종류에 따라 UUID를 기재하지 않으면 동작을 하지 않을 수 있다고 하는데, 나는 CentOS에서 UUID 기재 없이도 잘 되긴 했다. 그래도 혹시 모르니 기억해두기로 하자.

mkswap

 

 

[3] 스왑파일 활성화하기

이제 이 스왑파일을 활성화(메모리에 올리기) 해야 한다.

sudo swapon /swapfile

 

반대로 메모리에서 해제하려면 swapoff /swapfile 또는 swapoff -a를 통해 해제할 수 있다.

이때 권한 설정이 root 사용자에 대해 write 작업이 가능하도록 최소 600으로 지정되어 있어야만 오류가 나지 않는다.

 

참고: 권한때문에 일어나는 오류는 다음과 같다.

sudo swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
swapon: /swapfile: swapon failed: Operation not permitted

 

 

[4] 스왑파일 존재 확인

그다음 sudo swapon -s로 확인해보면, 아래와 같이 8GB짜리 스왑파일이 만들어진 것을 볼 수 있다.

스왑파일 생성 완료

 

또는 free -m으로 스왑 메모리 상태를 확인해볼 수도 있다. 그러면

Mem: ~~

Swap: ~~

이런식으로 확인 가능하다.

 

 


[5] 스왑파일을 매번 자동으로 메모리에 붙이기

스왑파일을 만들었지만 OS 재부팅시 메모리에 붙지 않는다.

OS를 다시 켜도 자동으로 메모리에 등록되고 가상메모리로 사용될 수 있게 하려면, 

리눅스 부팅 시스템에 등록해야 한다. 


/etc/fstab은 리눅스 파일시스템 정보를 저장하고 있는 경로이다. 리눅스 부팅시 마운트정보를 저장하고 있다.

부팅시 자동으로 저장된다. 만약 이 파일의 구성이 잘못된 경우 부팅할 때 파일시스템 마운트 과정에서 부팅이 멈추고 실패할 것이다. 스왑파일을 생성하면 아래 목록에 추가해야 한다. 내 /etc/fstab은 별 거 없는 상태로, 초기에 다음과 같았다.

 

 

이 파일에다가 아래와 같이 작성하고 저장해주면 된다.

/swapfile swap swap defaults 0 0

 

이렇게 스왑 파일(/swapfile)을 /etc/fstab에 등록하면

swapon -a 명령어를 통해 메모리에 올릴 수 있다.

 

 

반응형