✨ 가상 메모리
어떻게든 올려야 한다면 가상메모리(swap)를 고려해볼 수 있다!
물리적 RAM이 부족할 때 디스크 공간의 일부를 RAM처럼 사용할 수 있게 하는 시스템이 가상메모리이다. 스왑 영역을 늘린다는 것은, 우리 서비스 프로세스에 필요한 페이지를 RAM에 다 못올리니까 보조기억장치(스왑영역)에 적재해두겠다는 것이다. RAM이 작으니까 페이지 폴트가 무지하게 발생하는 것이므로... 디스크의 스왑 영역을 빈번하게 참조(read, write)하게 된다. 결국 디스크 I/O 연산이므로 CPU 부하를 증가시킨다.
이 방법은 잠시 서비스를 돌리기 위한 임시 방편이다.
우리 팀이 지원받고 있던 서버가 종료되어서..
임시로 2GB 클라우드 서버 만들어서 올려두기로 했기 때문이다 (잠시!)
✨ 스왑 용량 늘리기
시작해보자!
그 전에... 아래 글이 큰 도움이 되었다. 감사합니다.
🪄 현재 스왑파일 확인
swapon 명령으로 스왑파일이 존재하는지 확인할 수 있다.
sudo swapon --show
또는
sudo swapon -s
현재 스왑파일이 없는 상태다. 스왑을 사용하지 않는 상태로, 빈 리스트를 가진다.
🪄 스왑파일 생성하기
CentOS가 되느냐 되지 않느냐의 발견을 하신 분의 링크를 첨부한다. 도움을 많이 받았다.
https://shanepark.tistory.com/378
▶ 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은 출력파일의 경로를 지정하는건데, 우리는 스왑파일을 생성할 것이므로 스왑파일의 경로를 적어주면 된다.
🪄 스왑파일 생성 이후 작업
[1] 권한 변경
sudo chmod 600 /swapfile
루트 사용자만 스왑파일에 write 가능하도록 권한 변경해야 한다.
접근 권한을 변경하지 않으면, 이후에 스왑파일을 메모리에 올리는 작업에서 권한 오류가 난다.
[2] 방금 만든 스왑파일을 스왑공간으로 설정하기
mkswap 유틸리티를 이용해 해당 파일을 리눅스 스왑공간으로 설정해야 한다.
우리가 좀전에 생성한 /swapfile이라는 파일을 스왑 영역으로 초기화하여, 해당 스왑파일을 스왑공간으로 인식하고 사용할 수 있게 된다.
sudo mkswap /swapfile
그러면 Setting up swapspace ... 라고 뜨면서 UUID도 부여되고 스왑공간이 세팅된다.
다음 사진처럼.
이 UUID는 부팅시스템에 등록하여 설정을 유지하고자 할 때 필요할수도, 필요하지 않을 수도 있다.
설정에 등록할 때, 리눅스 종류에 따라 UUID를 기재하지 않으면 동작을 하지 않을 수 있다고 하는데, 나는 CentOS에서 UUID 기재 없이도 잘 되긴 했다. 그래도 혹시 모르니 기억해두기로 하자.
[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 명령어를 통해 메모리에 올릴 수 있다.
'컴퓨터구조 & OS' 카테고리의 다른 글
[OS] 터미널을 종료하면 프로세스도 종료된다 -- background로 실행하여 SIGHUP 시그널 피하기 (0) | 2024.02.26 |
---|---|
[운영체제] Process Control Block(PCB) (0) | 2023.10.06 |
[운영체제] 프로세스 상태도 (2) | 2023.09.28 |
[운영체제] 프로세스 스케줄링: 멀티프로그래밍 vs 타임쉐어링 (0) | 2023.09.27 |
[python] gpu(cuda) 프로세스 정리하기 (0) | 2023.09.12 |