우분투는 17.04부터 스왑파티션을 사용하지 않고 스왑파일을 만들어 메모리스왑 기능을 사용한다. 그런데, 자동 설치가 아닌, 사용자 설치를 할 경우 간혹 스왑파일이 생성되지 않는 경우가 있다. 그럴 경우 다음 방법으로 만들어준다.
우분투 커널 5 부터는 Btrfs 에서도 스왑파일을 쓸 수 있다. Ext4 는 기본 지원되고, 다른 파일시스템에 관해선 전혀 아는 바가 없다.
그렇다면, 수동으로 스왑파일을 지정해주려면 어떻게 해야 하려나?
다음 글들에서 도움을 얻었다.
- How To Add Swap on Ubuntu 18.04
- Create swap from File on BTRFS Filesystem
- How To Add/Remove Swap Space on Ubuntu 18.04
먼저 파일을 만들고, 그 파일이 스왑파일임을 시스템에 알려줘야 한다.
먼저 Ext4 용. (Btrfs 와 크게 다르진 않다.)
파일 생성
파일을 만드는 방법은 두가지인데, 예전부터 써오던 방식과, 신식(?)이 있다.
기존 방식: dd
원하는 파일 크기를 결정한 뒤, 이런 식으로 만든다.
$ sudo dd if=/dev/zero of=/swapfile bs=1G count=4
위 예는, 블럭 크기를 1GB 로 해서 총 4회를 수행하라는 것이 되어, 총 4GB 짜리 파일이 만들어진다.
새로운 방식: fallocate
$ sudo fallocate -l 4G /swapfile
dd 보다 쉽다. 역시 마찬가지로 4GB 짜리 파일을 생성했다.
파일 소유권 변경
이렇게 만든 파일을, root 만이 읽고 쓸 수 있도록 소유권을 변경한다.
$ sudo chmod 600 /swapfile
스왑파일로 변환 및 등록
먼저, 위에서 생성한 일반 파일을, 스왑파일로 사용할 수 있도록 변환해야 한다.
$ sudo mkswap /swapfile
이제 이 파일을 시스템이 스왑으로 쓸 수 있도록 등록한다. (시스템이 켜져있는 동안만 인식됨. 재시동되면 재설정 필요)
따라서 아래 작업은 굳이 안해도 되고, 그냥 fstab 에 지정해준 뒤 시스템을 재부팅하는 편이 좋다.
$ sudo swapon /swapfile
스왑파일 영구 등록
위에서 한 작업은 시스템이 꺼지면 모두 잊혀져 버린다. 시스템이 재시작되어도 자동으로 저 파일을 스왑으로 쓸 수 있도록 하려면 fstab 에 등록해야 한다.
/etc/fstab 을 열고, 다음 내용을 추가한다.
/swapfile none swap sw 0 0
Btrfs 용 스왑파일 생성.
거의 방법은 동일한데, NOCOW (NO Copy-On-Write) 를 고려해야하는 점이 다르다.
또, 만약 snapshot 을 사용한다면, 이 파일을 snapshot 이 사용되는 Sub volume 에 만들지 말고, 다른 Sub volume 에 만들어야만 한다.
NOCOW 를 위해선 바로 fallocate 를 하지 말고, 먼저 touch 후 chattr 을 해줘야한다. fallocate 로 파일을 생성한 뒤 chattr 을 하면, swapon 에서 오류가 발생한다.
그 이유는 man chattr
에서 찾아볼 수 있다.
Note: For btrfs, the ‘C’ flag should be set on new or empty files. If it is set on a file which already has data blocks, it is undefined when the blocks assigned to the file will be fully stable. If the ‘C’ flag is set on a directory, it will have no effect on the directory, but new files created in that directory will have the No_COW attribute set.
$ sudo -i # touch /var/swap/swapfile-btrfs # chattr +C /var/swap/swapfile-btrfs # fallocate -l 4G /var/swap/swapfile-btrfs # chmod 600 /var/swap/swapfile-btrfs # mkswap /var/swap/swapfile-btrfs # swapon /var/swap/swapfile-btrfs
파일을 어디에 만들까 하다가, /var/swap 디렉토리에 넣었다.
또, 이게 잘하는 짓인지는 모르겠지만, @swap 이란 서브볼륨을 만들고, /var/swap 에 마운트 시켜줬다.
물론, 굳이 이렇게 하지 않아도 된다.
위 작업을 완료한 뒤, /etc/fstab 에 스왑파일을 추가한다.
/swapfile none swap sw 0 0
검사
swapon
또는 free
등을 사용할 수 있다.
$ swapon -s Filename Type Size Used Priority /var/swap/swapfile-btrfs file 8388604 0 -2 $ free -m total used free shared buff/cache available Mem: 7358 646 5076 4 1635 6396 Swap: 8191 0 8191
한가지 더: swappiness
자세한 사항은 연결글을 참고하고, swappiness 를 1~10 사이로 정한다. 서버가 아닌 데스크탑(GUI) 환경에서, HDD 라면 10 정도, SSD 라면 1 정도를 주는 편이 좋다고 한다. (기본값은 60인데, 이 설정치에 정답은 없다.)
/etc/sysctl.d/번호-xxx.conf 파일을 만들고, 다음 항목을 추가한다.
번호는 얼마를 줘야한다는 규칙은 있을텐데, 적당히 넣어도 관계없다. 60, 70 정도면 된다.
vm.swappiness=10
Cache Pressure?
이 개념은 처음 보는 건데, 이 값도 기본 설정치인 100 에서 50 정도로 줄여주는 편이 좋다고 한다.
위의 swappiness 를 넣은 파일에 같이 넣어도 되고, 동일 디렉토리에 다른 이름의 파일을 만든 뒤 다음 항목을 추가해도 된다.
vm.vfs_cache_pressure = 50
이 항목에 대한 건 뭐라 할 말이 없다. 난생 처음 보는 거라서..