Swap과 메모리 회수
스왑 · 스와핑
Swap은 일부 메모리 페이지의 내용을 RAM 밖에 보관하고 필요할 때 다시 읽을 수 있게 하는 저장 공간이다. 의 한 구성 요소이며 파일 캐시 회수·프로세스별 제한·OOM과 서로 다른 역할을 가진다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 회수 대상인 페이지를 저장할 공간을 제공한다.
- 파일 캐시와 사이의 회수 선택을 조정하는 데 관여한다.
- 메모리 압박 상황에서 용량·지연·진행 가능성의 균형을 관리한다.
02어떤 순서로 동작하나
- 메모리 압박 감지
시스템 또는 cgroup의 메모리 요구와 제한 때문에 페이지 회수가 필요해진다.
- 회수 후보 선정
파일로 다시 읽을 수 있는 캐시, 수정된 파일 페이지, 익명 페이지의 상태에 따라 처리할 후보가 달라진다.
- 내용 보존과 해제
필요한 쓰기나 Swap 저장을 수행하고 회수 가능한 물리 페이지를 다른 용도로 제공한다.
- 재접근과 복원
Swap으로 나간 페이지를 다시 요구하면 내용을 읽고 매핑을 마련해 실행을 재개한다. 반복 왕복이 많으면 지연과 정체가 커진다.
03먼저 알아둘 용어와 구성요소
- 는 남는 메모리를 등에 활용한다. 파일에서 읽었고 수정되지 않은 깨끗한 페이지는 원본 파일에서 다시 읽을 수 있으므로 회수 대상이 될 수 있다. 수정된 파일 페이지는 해당 내용을 보존하기 위해 저장 장치로 쓰는 처리가 필요하다. 캐시가 크다는 사실만으로 메모리 누수라고 보지 않는 이유다.
- 일반적인 는 대응하는 원본 파일이 없으므로 내용을 버렸다가 파일에서 다시 읽을 수 없다. 운영체제는 조건에 따라 Swap으로 내보내거나, 압축 메모리 등 구성된 기능을 활용할 수 있다. Swap이 없다면 선택 가능한 회수 경로가 달라진다. 전체 RAM이 남아 있어도 컨테이너·서비스의 메모리 제한 때문에 별도의 부족 상황이 생길 수 있다.
- 작업에 필요한 페이지 집합이 가용 메모리보다 커서 반복적으로 내보내고 다시 읽는 상태에서는 처리 시간의 많은 부분을 메모리 회수와 I/O에 사용한다. 이를 단순히 “Swap을 더 만들면 해결”로 접근하면 원인인 작업량·제한·누수·비효율적 캐시를 놓칠 수 있다.
- Swap은 전용 파티션이나 지원되는 파일 시스템의 파일 등으로 제공할 수 있다. 파일을 사용할 때는 해당 파일 시스템의 hole·Copy-on-Write·스냅샷 제약을 확인해야 한다. 모든 파일 시스템에서 같은 fallocate 절차를 그대로 적용할 수 있다고 가정하면 안 된다. 권한과 영구 설정도 함께 관리해야 하지만, 이미 운영 중인 저장 영역을 잘못 초기화하는 위험 때문에 개념 이해와 실제 변경 작업은 구분한다.
- 는 RAM이 몇 퍼센트 찼을 때 Swap을 켜는 임계값이 아니다. 회수 과정에서 익명 페이지와 파일 기반 페이지의 비용을 비교하는 정책 매개변수다. 최적값은 저장 장치·압축 Swap·작업 특성에 따라 달라지므로 “항상 낮을수록 좋다”는 규칙으로 외우지 않는다. 변경 전후의 지연과 I/O를 비교해야 의미가 있다.
- /proc/pressure/memory의 some은 일부 작업이 메모리 자원 때문에 정체한 시간, full은 모든 비유휴 작업이 동시에 정체한 시간의 비율이다. 단순 메모리 사용률이 아니다.
inxi의 메모리·Swap 요약을 커널 통계와 연결하기
설치 용량·커널이 이용할 용량·현재 사용량을 구별하고, Swap 사용량 0이 의미하는 범위를 확인한다.
실습 구성과 전제
- 화면은 게스트의 이며 inxi 3.3.33 출력을 보여 준다.
- inxi 요약 두 장은 서로 다른 시점이다. 작은 사용량 차이를 곧바로 누수나 성능 문제로 판정하지 않는다.
도구의 필드 정의부터 맞춘다
- inxi의 total은 설치된 RAM 규모, available은 예약 영역 등을 뺀 커널 사용 가능 총량이다. free의 available이나 /proc/meminfo의 MemAvailable과 같은 뜻이 아니다.
- 화면의 사용률은 inxi available을 기준으로 한다. 설치 용량 4 GiB를 분모로 임의 계산하면 표시값과 다를 수 있다.
원본 크기로 보기 ↗- Info Memory 행은 total 4 GiB, available 3.54 GiB, used 627.8 MiB (17.3%)다.
- Swap 행에는 type partition, size 3.91 GiB, used 0 KiB와 /dev/dm-1이 보인다.
확인 기준RAM 용량과 Swap 파티션 크기를 서로 다른 자원으로 기록한다.
한 시점의 사용량과 시간에 따른 압력을 분리한다
- 다른 요약은 629.8 MiB/3.54 GiB와 17.4%를 보여 준다. ·캐시·관측 시각이 바뀌면 사용량도 변할 수 있다.
- 누수나 압력 여부는 시간에 따른 추세, 점유, 회수·입출력 지표와 함께 판단한다. 단일 전체 사용률만으로 특정 가 원인이라고 할 수 없다.
bashfree -h vmstat 1 5 cat /proc/meminfo현 환경에서 메모리 가용 추정치와 시간 구간별 활동을 비교하는 조회 예시다.
원본 크기로 보기 ↗- 간략 출력은 Mem 629.8 MiB/3.54 GiB (17.4%)로 표기된다.
- Uptime과 프로세스 수가 상세 화면과 달라 같은 순간의 완전한 반복 측정으로 볼 수 없다.
확인 기준vmstat 첫 줄과 후속 구간의 의미를 구분하고 si·so 및 실행 대기·I/O 지표를 함께 읽는다.
Swap 0과 Swap 비활성을 구별한다
- 사용량 0은 그때 Swap에 사용 중인 양이 없다는 뜻이다. 구성·활성화 여부는 활성 Swap 목록으로 별도 확인한다.
- Swap 사용량이 존재하는 것만으로 현재 심한 스와핑이라고 할 수도 없다. 실제 swap-in/out 활동과 메모리 압력의 동시 관측이 필요하다.
bashswapon --show cat /proc/swaps cat /proc/pressure/memory활성 Swap과 지원되는 커널의 메모리 압력을 읽는다. 경로는 커널 설정에 따라 없을 수 있다.
확인 기준활성 목록, 사용량, 구간별 입출력을 서로 다른 항목으로 기록한다. 캡처에는 Swap 변경·비활성화 결과가 없다.
실습에서 확인한 동작 원리
- 같은 available이라는 이름도 도구에 따라 정의가 다르므로 필드의 분모와 단위를 확인한다.
- ·현재 RAM 점유·Swap 구성·현재 은 구별해서 관측한다.
04예제로 따라가기
- Swap 사용량이 1GiB라는 한 번의 출력은 현재 계속 디스크를 왕복한다는 증거가 아니다. vmstat의 구간별 swap-in/out과 지연을 함께 읽는다.
- 메모리를 해제해도 할당기가 공간을 재사용용으로 보유하면 RSS가 즉시 줄지 않을 수 있으므로 곧바로 누수라고 단정하지 않는다.
- 호스트 RAM이 남아도 컨테이너의 memory.max에 도달하면 그 범위에서 OOM이 발생할 수 있어 전체 free만으로 설명하지 못한다.
05혼동하기 쉬운 점과 확인 기준
- swapoff는 사용 중인 Swap 데이터를 다시 처리해야 하므로 여유 메모리와 다른 회수 자원이 부족하면 실패하거나 큰 압박을 만들 수 있다. 사용량 숫자를 0으로 만들기 위해 습관적으로 수행할 작업이 아니다. RAM을 늘리거나 불필요한 작업을 줄이는 조치와 달리, 문제의 원인을 제거하지 않을 수 있다.
- free의 free는 완전히 사용하지 않는 메모리이고, available은 새 작업에 사용할 수 있을 것으로 추정되는 양이다. 둘은 같은 값이 아니다. buff/cache와 reclaimable 메모리 등을 고려해야 한다. Swap used가 남아 있어도 현재 활발한 Swap I/O가 발생한다는 뜻은 아니다. 이전에 밀려난 덜 쓰는 페이지가 그대로 남을 수 있다.
- cgroup v2의 memory.high는 회수·처리 제한의 경계다. 이를 넘으면 지연과 회수 압력이 생기지만 이 한계 초과 자체가 OOM killer를 호출하지는 않는다. memory.max에서 회수에 실패하는 경우와 구분한다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
cgroup v2의 memory.high·max·events
Memory Interface Files에서 memory.high와 memory.max를 나란히 읽고 memory.events의 high·oom·oom_kill을 연결한다. Swap 사용량과 메모리 압박, OOM 종료를 별도 관측으로 구별하는 경로다.
- high 초과가 회수·제한으로 이어지는 조건
- max 한계에서 회수가 불가능한 경우의 OOM 범위
- memory.events가 단순 사용 바이트가 아닌 사건 횟수인 점
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.