현재 메모리·swap 사용 추세와 OOM 로그, 워크로드 지연 허용 범위
운영체제 · 구성 레시피
Linux swap 파일과 swappiness 구성
메모리 압력과 파일시스템 제약을 먼저 확인하고 기존 파일을 덮어쓰지 않는 swap 파일을 만든 뒤, fstab 검증·재부팅 지속성·안전한 swapoff 롤백까지 점검합니다.BEFORE YOU START
시작 전에 준비하세요
swap 크기만큼의 실제 디스크 여유와 파일시스템 종류·CoW 여부
sudo 권한, /etc/fstab·sysctl 설정 백업, 유지보수 재부팅 계획
메모리 부족 때 서비스를 축소하거나 용량을 증설할 별도 복구 절차
권장 대상 메모리 급증 시 즉시 OOM으로 종료되는 위험을 완화하되 swap을 RAM 대체재로 오해하지 않으려는 서버 운영자
FOLLOW THE RECIPE
8단계 구성·점검 레시피
메모리 압력과 파일시스템 확인
swap 크기나 swappiness를 고정 공식으로 정하지 않습니다. 실제 메모리 압력, 저장장치 지연, 파일시스템 특성을 먼저 확인합니다.
cat /etc/os-release
uname -srfree -h
swapon --show --bytesfindmnt -no SOURCE,FSTYPE,OPTIONS /
df -hT /sysctl vm.swappiness- OOM 원인이 누수·과도한 worker가 아닌지 먼저 조사했다.
- swap 크기만큼 할당해도 운영 여유 공간이 남는다.
- 파일시스템이 ext4·XFS인지 Btrfs인지 구분했다.
swap은 메모리 부족의 완충 장치이며 지속적인 page-in/out을 해결하지 않습니다. 메모리 누수나 용량 부족은 별도로 수정합니다.
기존 swap·fstab·동일 파일과 파일시스템 제약을 확인합니다.
기존 swap과 충돌·여유량 점검
기존 /swapfile을 덮어쓰지 않습니다. 활성 swap, fstab 중복, 파일 존재, Btrfs 다중 장치·snapshot 제약을 먼저 확인합니다.
swapon --show --output=NAME,TYPE,SIZE,USED,PRIOgrep -n -E '[[:space:]]swap[[:space:]]' /etc/fstabsudo test ! -e /swapfile종료 코드 0일 때만 신규 생성할 수 있습니다. 파일이 있으면 소유·용도를 조사하고 중단합니다.sudo journalctl -k --since '-7 days' | grep -Ei 'out of memory|oom-kill|memory cgroup'sudo btrfs filesystem usage /루트 파일시스템이 Btrfs일 때만 사용합니다. 다중 장치나 지원하지 않는 data profile이면 이 레시피에서 생성하지 않습니다.- /swapfile이 존재하지 않고 fstab에 중복 항목이 없다.
- 현재 swap 우선순위와 사용량을 기록했다.
- 서비스를 중단하지 않고 swapoff할 수 있는 메모리 여유 기준을 정했다.
기존 swap이 충분하지만 OOM이 발생했다면 cgroup 제한·메모리 누수·overcommit을 먼저 확인합니다.
배포판 util-linux와 파일시스템 전용 도구를 확인합니다.
swap 관리 도구 확인
mkswap·swapon·fallocate가 포함된 배포판 util-linux를 사용합니다. Btrfs 분기는 배포판 btrfs-progs가 공식 mkswapfile을 제공할 때만 선택합니다.
command -v fallocate
command -v mkswap
command -v swapon
command -v findmntapt-get --simulate install util-linuxsudo apt-get install util-linuxsudo dnf info util-linuxsudo dnf install util-linuxmkswap --help | grep -- '--file'
btrfs filesystem mkswapfile --help각 기능이 실제로 제공되는 환경에서만 해당 대안 분기를 사용합니다.- 현재 배포판에 맞는 설치 분기만 사용했다.
- util-linux 버전과 지원 옵션을 확인했다.
- Btrfs가 아니라면 btrfs 명령을 설치하거나 실행하지 않는다.
필요 옵션이 없으면 임의 다운로드 도구를 사용하지 말고 배포판·파일시스템 공식 절차를 선택합니다.
파일시스템에 맞는 한 생성 분기만 선택하고 설정을 백업합니다.
swap 파일 생성과 지속 설정 준비
ext4·XFS fallocate, 지원되는 mkswap --file, Btrfs mkswapfile 중 정확히 한 분기만 사용합니다. 블록 장치나 파티션을 초기화하는 명령은 제공하지 않습니다.
date -u +%Y%m%dT%H%M%SZsudo cp --preserve=all --no-clobber /etc/fstab /etc/fstab.<BACKUP_SUFFIX>.baksudo cp --preserve=all --no-clobber /etc/sysctl.d/60-swappiness.conf /etc/sysctl.d/60-swappiness.conf.<BACKUP_SUFFIX>.bak기존 파일이 있을 때만 실행합니다.sudo test ! -e /swapfile && sudo fallocate --length <SWAP_SIZE_GIB>GiB /swapfileext4 또는 XFS에서만 사용합니다. 실패하거나 이후 swapon이 holes를 경고하면 반복 실행하지 말고 파일을 .failed로 보존한 뒤 지원되는 대안 분기를 검토합니다.sudo test ! -e /swapfile && sudo mkswap --file --size <SWAP_SIZE_GIB>GiB /swapfilemkswap --help에 --file·--size가 실제로 표시되고 기본 분기를 사용하지 않은 경우에만 사용합니다. 이 명령은 생성과 swap 서명 작성을 함께 수행하므로 아래 별도 mkswap을 중복 실행하지 않습니다.sudo test ! -e /swapfile && sudo btrfs filesystem mkswapfile --size <SWAP_SIZE_GIB>GiB /swapfile단일 장치·지원 data profile·지원 btrfs-progs인 Btrfs에서만 사용합니다. 활성 swapfile이 있는 subvolume은 snapshot할 수 없습니다.sudo chown root:root /swapfile
sudo chmod 0600 /swapfilesudo mkswap /swapfilefallocate 기본 분기에서만 실행합니다. 대상이 정확히 /swapfile 일반 파일인지 stat으로 다시 확인합니다.sudoedit /etc/fstabsudoedit /etc/sysctl.d/60-swappiness.conf/swapfile none swap defaults 0 0동일한 항목이 없는지 확인하고 한 줄만 추가합니다. 전체 fstab을 예시로 교체하지 않습니다.vm.swappiness=<SWAPPINESS>커널 허용 범위는 0~200이며 기본값은 일반적으로 60입니다. 0을 swap 금지로 오해하지 말고 저장장치와 워크로드를 측정해 결정합니다.- 세 생성 분기 중 파일시스템에 맞는 하나만 사용했다.
- 대상은 블록 장치가 아니라 정확한 /swapfile 일반 파일이다.
- /swapfile은 root:root 0600이다.
- fstab에는 동일한 swap 행이 한 개만 있다.
- swappiness 값의 측정 근거와 이전 값을 기록했다.
swapon이 holes 또는 CoW 오류를 반환하면 우회 옵션을 찾지 말고 파일시스템 공식 생성 명령과 제약을 다시 확인합니다.
fstab을 검증한 뒤 swap과 swappiness를 단계적으로 활성화합니다.
fstab 검증 후 swap 활성화
fstab 검증이 실패하면 swapon을 실행하지 않습니다. swap 파일만 먼저 활성화하고 확인한 뒤 swappiness drop-in을 적용합니다.
sudo stat -c '%F %U:%G %a %s %n' /swapfile
sudo file /swapfilesudo findmnt --verify --verbose && sudo swapon /swapfileswapon --show --output=NAME,TYPE,SIZE,USED,PRIO
free -hsudo sysctl -p /etc/sysctl.d/60-swappiness.confsysctl vm.swappiness- findmnt 검증 성공 뒤에만 swapon했다.
- 활성 swap 이름·크기가 계획과 일치한다.
- swappiness가 승인한 값으로 반영됐다.
- 애플리케이션 지연과 디스크 I/O를 관찰하기 시작했다.
swap이 활성화돼도 즉시 사용량이 생기지 않는 것은 정상입니다. 강제로 메모리 압력을 만들지 않습니다.
재부팅 지속성과 실제 압력 지표를 안전하게 검증합니다.
재부팅 지속성과 메모리 지표 검증
부하를 인위적으로 만들어 OOM을 유발하지 않습니다. 정상 트래픽에서 swap-in/out, I/O 지연, 서비스 응답을 관찰합니다.
swapon --show --output=NAME,TYPE,SIZE,USED,PRIO
free -hvmstat 1 5sudo findmnt --verify --verbose
grep -n -F '/swapfile none swap defaults 0 0' /etc/fstabswapon --show
sysctl vm.swappiness
systemctl --failed --no-pager승인된 유지보수 재부팅 뒤 실행합니다. 이 레시피에서 자동 재부팅하지 않습니다.- 재부팅 후 /swapfile이 한 번만 활성화된다.
- swappiness 값이 유지된다.
- 지속적인 si·so와 높은 I/O wait가 발생하지 않는다.
- 애플리케이션 응답 지연이 허용 범위다.
지속적인 swap 활동은 RAM 부족 또는 워크로드 문제의 신호입니다. swappiness만 반복 조정하지 말고 메모리 용량·프로세스를 확인합니다.
권한·dump 민감정보·Btrfs snapshot 제약과 OOM 정책을 점검합니다.
권한과 데이터 노출 위험 점검
swap에는 메모리에 있던 민감정보가 기록될 수 있습니다. 서버 위협 모델에 따라 전체 디스크 암호화·암호화 swap을 별도 설계합니다.
sudo stat -c '%F %U:%G %a %n' /swapfilesudo stat -c '%U:%G %a %n' /etc/fstab /etc/sysctl.d/60-swappiness.confsudo journalctl -k --since '-24 hours' | grep -Ei 'oom|out of memory|I/O error|swap'swapon --show --bytes- /swapfile은 root:root 0600이다.
- 백업·스냅샷에 swap 파일을 불필요하게 포함하지 않는다.
- 민감 워크로드는 저장장치 암호화 요구사항을 별도로 검토했다.
- Btrfs subvolume snapshot 제한을 운영 문서에 반영했다.
- swap을 OOM·메모리 누수의 유일한 해결책으로 사용하지 않는다.
암호화 요구가 있다면 이 일반 swap 파일을 확대하지 말고 부팅·키 관리까지 포함한 별도 설계를 사용합니다.
롤백은 충분한 RAM을 확인한 뒤 정확한 swap 파일만 비활성화합니다.
메모리 확인 후 안전하게 swap 원복
swapoff는 사용 중인 페이지를 RAM으로 되돌리므로 여유 메모리가 부족하면 실패하거나 서비스에 영향을 줄 수 있습니다. 먼저 사용량을 낮추고 유지보수 시간에 진행합니다.
free -h
swapon --show --output=NAME,SIZE,USED,PRIO
vmstat 1 5sudo swapoff /swapfile가용 RAM이 /swapfile의 실제 USED와 서비스 여유분보다 충분하고 유지보수 승인을 받은 경우에만 실행합니다. 실패하면 반복하지 말고 메모리 사용을 먼저 낮춥니다.sudoedit /etc/fstab/swapfile none swap defaults 0 0 한 줄만 제거합니다. 다른 마운트 항목은 변경하지 않습니다.sudo findmnt --verify --verbosesudo mv /etc/sysctl.d/60-swappiness.conf /etc/sysctl.d/60-swappiness.conf.disabled.<ROLLBACK_SUFFIX>sudo cp --preserve=all /etc/sysctl.d/60-swappiness.conf.<BACKUP_SUFFIX>.bak /etc/sysctl.d/60-swappiness.conf && sudo sysctl -p /etc/sysctl.d/60-swappiness.conf작업 전 실제 백업이 있었던 경우에만 실행합니다.sudo sysctl -w vm.swappiness=<PREVIOUS_SWAPPINESS>기존 drop-in이 없었던 경우 기록한 이전 값을 복원합니다.sudo mv /swapfile /swapfile.disabled.<ROLLBACK_SUFFIX>
sudo chmod 0600 /swapfile.disabled.<ROLLBACK_SUFFIX>swapoff 성공과 fstab 항목 제거·검증을 확인한 뒤에만 실행합니다. 즉시 삭제하지 않습니다.swapon --show
free -h
sysctl vm.swappiness- 충분한 가용 RAM과 유지보수 시간을 확인한 뒤 swapoff했다.
- 다른 swap을 끄지 않고 정확한 /swapfile만 대상으로 했다.
- fstab 한 줄만 제거하고 전체 검증을 통과했다.
- 파일은 삭제하지 않고 0600 상태로 비활성화 보존했다.
- 이전 swappiness와 서비스 상태를 복원했다.
swapoff가 메모리 부족으로 실패하면 fstab이나 파일을 먼저 건드리지 말고 서비스 축소·RAM 증설·점진적 사용량 감소를 계획합니다.
원인을 파일시스템 제약·메모리 용량·워크로드·I/O 성능으로 분리합니다.
SECURITY CHECK
운영 전 마지막 보안 점검
- 기존 /swapfile을 덮어쓰지 않고 블록 장치 명령을 사용하지 않는다.
- 파일시스템에 맞는 한 생성 분기만 사용한다.
- /swapfile은 root:root 0600이고 fstab을 활성화 전에 검증한다.
- swappiness는 0~200 범위에서 실제 I/O 비용과 워크로드로 결정한다.
- swapoff 전에 실제 사용량보다 충분한 RAM을 확보한다.
- swap의 민감정보 저장 위험과 암호화 요구를 별도 검토한다.
COMMON ERRORS
자주 막히는 지점
swapon이 holes 또는 Invalid argument를 반환
- 증상
- mkswap은 성공했지만 swap 활성화가 거부됩니다.
- 가능한 원인
- sparse 파일, CoW Btrfs, 지원하지 않는 preallocation 또는 다중 장치 제약일 수 있습니다.
- 확인 순서
- 반복 활성화하지 말고 파일을 비활성 보존한 뒤 util-linux --file 또는 Btrfs 공식 mkswapfile 지원 여부를 확인합니다.
swapoff가 Cannot allocate memory로 실패
- 증상
- 대상 swap이 계속 active이고 swapoff 종료 코드가 실패합니다.
- 가능한 원인
- swap의 사용 페이지를 수용할 RAM 여유가 부족합니다.
- 확인 순서
- fstab·파일을 변경하지 말고 메모리 사용을 줄이거나 RAM을 증설한 유지보수 시간에 다시 시도합니다.
swap 추가 후 서버 지연이 커짐
- 증상
- vmstat의 si·so와 I/O wait가 지속적으로 높습니다.
- 가능한 원인
- RAM 부족, 과도한 swappiness 또는 느린 저장장치에 지속적으로 paging하고 있습니다.
- 확인 순서
- 프로세스별 메모리·cgroup 제한·누수를 확인하고 RAM 또는 워크로드를 조정합니다.
PRIMARY REFERENCES
공식 문서
설치 저장소와 지원 버전은 바뀔 수 있습니다. 검토일 이후에는 링크된 공식 문서와 현재 서버의 패키지 후보 버전을 함께 확인하세요.