어떤 장치나 파일이 swap 으로 잡혀 있는지 먼저 본다.
swapon --show
free -h
cat /proc/swaps
swapoff 는 swap 에 나가 있던 페이지를 전부 메모리로 되읽어 온다. 따라서 여유 메모리가 swap 사용량보다 적으면 실패하거나 OOM 을 부른다. 사용량이 큰 서버에서는 작업 전에 free -h 로 여유를 확인하고, 필요하면 프로세스를 먼저 정리한다.
swapoff -a # 전부 끄기
swapoff /dev/mapper/vg0-swap
swapoff /swapfile
swapon -a # fstab 에 적힌 것 전부 켜기
swapon /dev/mapper/vg0-swap
swapon --show
swapoff 는 현재 부팅에만 적용된다. 영구적으로 끄려면 /etc/fstab 에서 swap 줄을 주석 처리한다.
# UUID=1b0e... none swap defaults 0 0
# /swapfile none swap defaults 0 0
systemd 가 자동으로 만든 .swap 유닛이 남아 다시 켜지는 경우가 있다. fstab 을 고쳤는데도 재부팅 후 swap 이 살아 있으면 유닛을 확인한다.
systemctl list-units --type swap
systemctl mask dev-mapper-vg0\x2dswap.swap
systemctl daemon-reload
클라우드 이미지나 일부 배포판은 zram-generator · systemd-zram-setup 로 메모리 안에 압축 swap 을 만든다. 이 경우 fstab 에는 아무것도 없으므로 해당 서비스를 꺼야 한다.
systemctl status systemd-zram-setup@zram0.service
Kubernetes 는 오랫동안 노드에 swap 이 켜져 있으면 kubelet 이 기동하지 않았고, 지금도 별도 설정 없이는 끄는 것이 기본이다. Hadoop 계열과 데이터베이스도 응답 지연을 피하려고 끄거나 최소화한다.
다만 완전히 끄면 메모리가 모자랄 때 곧바로 OOM Killer 가 동작한다. 여유를 조금 두고 싶다면 swap 을 남기고 vm.swappiness 를 낮추는 쪽이 낫다.
sysctl -w vm.swappiness=1
echo 'vm.swappiness = 1' > /etc/sysctl.d/99-swappiness.conf