AWS 인스턴스를 생성하면 swap이 안 달린 경우가 왕왕 있다. 여지껏 이렇게 생각했었다.
어차피 Out-of-memory (OOM) 되면 커널이 프로그램들을 죽일건데 뭐. 스왑 달려있으면 디스크나 드륵드륵 긁히고 (윈도우+하드디스크 시절 기억으로.) 버팅기다가 죽을 것 늦게 죽기나 하는 것 아닌가?
하지만 그렇지 않았다.
리눅스 커널은 좀더 똑똑하게 처리하는데, swap을 4GB정도로만 주면 (옛날엔 램 용량 2x가 룰이던 시절이 있었음, 그게 2배 해서 4GB, 8GB정도임) 디스크에 내려놓을 cold한 것 내려놓고 시스템 느려지지 않게 잘 처리한다.
스왑이 없으면:
RAM fills, Kernel tries reclaim, Reclaim fails quickly, Direct reclaim + stalls spike, System freezes, Kernel OOM killer fires (late, brutal)
있으면:
RAM fills, Kernel has one extra degree of freedom:
can evict cold anonymous pages → swap
Reclaim becomes gradual instead of abrupt, Memory pressure rises more smoothly, OOMD gets time to react early
스왑 파티션을 만들진 않아도 디스크에 스왑 이미지만 주면 된다. 다만 BTRFS의 경우 AI나 일반적인 자료가 주는대로 생성하면 안 되고 이 링크대로 생성해야 함:
https://unix.stackexchange.com/questions/599949/swapfile-swapon-invalid-argument
Swapfile Swapon invalid argument
I had swap from a swapfile working for quite some time, but for some reason it stopped working. sudo fallocate -l 4G /home/.swap/swapfile sudo chmod 600 /home/.swap/swapfile sudo mkswap /home/.swap/
unix.stackexchange.com
* sudo btrfs filesystem mkswapfile --size 4G /path/swap.img
* sudo chmod 600 /path/swap.img
* /etc/fstab 수정. 예: /path/swap.img none swap defaults 0 0
* sudo swapon -a
htop등으로 확인해보면 스왑이 activate 될 것이다.
그리고 oomd, 우분투 버전마다 다르지만 systemd-oomd 패키지로 설치해서 가동시킨다. 디폴트 옵션대로 실행했다. 설정파일은 /etc/systemd/oomd.conf 이다. arch linux도 systemd-oomd였나? oomd로 검색하면 나오니 설치자체도 쉽다. 얘는 swap이 있으면 memory pressure (메모리 자체가 얼마나 꽉 찼는가가 아니라 얼마나 스왑이 긁히고 있나) 를 감지해서 메모리 많이 먹는 사용자 프로세스를 죽인다.
그동안 사용자가 많은 시스템에서 OOM으로 고생했는데 이번 세팅으로 나아지길 기대하고 있다.