스레싱부터 메모리 압축까지: 가상 메모리 성능을 다루는 방법
스레싱, 워킹셋, PFF, 페이지 크기, zswap·zram과 메모리 과할당 정책을 통해 가상 메모리 성능 저하를 분석한다.
2026-08-14 · 최초 발행 2026-01-16
CPU가 일을 못 하고 페이지 교체에 묶이는 순간
스레싱(Thrashing)은 프로세스가 실행보다 페이지 교체에 더 많은 시간을 쓰는 상태다. 물리 메모리가 모자라 페이지 폴트가 계속 발생하고, 디스크 I/O 대기 때문에 CPU 이용률은 크게 떨어진다.
스레싱은 대체로 다음 조건이 겹칠 때 나타난다.
| 조건 | 내용 |
|---|---|
| 과도한 멀티프로그래밍 | 동시에 실행하는 프로세스 수가 물리 메모리 용량을 넘음 |
| 불충분한 프레임 할당 | 프로세스 워킹셋보다 적은 프레임을 배정함 |
| 지역성 부재 | 프로그램의 메모리 접근 패턴이 불규칙함 |
| 부적절한 페이지 교체 | 곧 다시 필요할 페이지를 교체함 |
이 순환이 계속되면 시스템은 거의 멈춘 것처럼 보인다. CPU 이용률은 급락하고 디스크는 페이지 스왑 작업을 반복한다.
워킹셋으로 필요한 메모리 범위를 잡는다
Peter Denning이 1968년에 제안한 워킹셋 모델은 스레싱을 피하기 위한 핵심 기준이다. 워킹셋은 특정 시간 윈도우(Δ) 안에서 프로세스가 참조한 페이지의 집합을 뜻한다.
프로세스에는 워킹셋 크기만큼의 프레임을 최소로 할당한다. 워킹셋이 변하면 할당량도 조정하며, 모든 워킹셋의 합이 물리 메모리를 넘으면 일부 프로세스를 중단해 스레싱을 막는다.
윈도우 크기 Δ도 영향을 준다.
- Δ가 너무 작으면 실제로 필요한 페이지가 워킹셋에 들어오지 못한다.
- Δ가 너무 크면 불필요한 페이지까지 포함돼 메모리를 낭비한다.
- 적절한 Δ는 프로세스의 지역성을 반영해야 한다.
페이지 폴트 빈도로 압박을 감시하는 PFF
PFF(Page Fault Frequency)는 페이지 폴트 빈도를 관찰해 스레싱 여부를 판단하는 기법이다. 빈도가 상한을 넘으면 프레임을 더 할당하고, 하한보다 낮으면 프레임을 회수한다. 가용 프레임이 부족한 경우에는 프로세스를 중단하거나 스왑 아웃한다.
운영 측면에서는 물리 메모리 증설, 멀티프로그래밍 정도 축소, 일부 프로세스의 스왑 아웃, 워킹셋 기반 프레임 할당, LRU 같은 페이지 교체 알고리즘 개선을 함께 검토할 수 있다.
페이지 크기가 바꾸는 비용의 위치
페이지 크기는 내부 단편화, 페이지 테이블 크기, TLB 효율, 디스크 I/O 특성에 직접 영향을 준다.
| 측면 | 작은 페이지 | 큰 페이지 |
|---|---|---|
| 내부 단편화 | 적음 (평균 페이지 크기/2) | 많음 |
| 페이지 테이블 | 크기 큼, 엔트리 많음 | 크기 작음, 엔트리 적음 |
| TLB 효율 | 커버리지 낮음 | 커버리지 높음 |
| I/O 효율 | 전송 오버헤드 큼 | 효율적인 대용량 전송 |
| 지역성 활용 | 세밀한 제어 | 공간 지역성 낭비 가능 |
| 메모리 해상도 | 높음 | 낮음 |
페이지 크기는 내부 단편화와 페이지 테이블 오버헤드 사이의 균형점에서 정할 수 있다. 평균 프로세스 크기를 s, 페이지 크기를 p, 페이지 테이블 엔트리 크기를 e로 두면 내부 단편화 손실은 프로세스당 p/2이고, 페이지 테이블 오버헤드는 프로세스당 s/p × e다.
총 오버헤드를 최소화하는 식은 다음과 같다.
d/dp(p/2 + se/p) = 0 → p = √(2se)
| 시스템 | 기본 페이지 크기 | 대용량 페이지 |
|---|---|---|
| x86 Linux | 4KB | 2MB, 1GB |
| x86 Windows | 4KB | 2MB |
| ARM64 | 4KB, 16KB, 64KB | 2MB, 1GB |
| SPARC | 8KB | 64KB, 512KB, 4MB |
압축 메모리로 스왑 I/O를 줄이는 방식
메모리 압축(Memory Compression)은 페이지 데이터를 압축해 저장함으로써 물리 메모리 사용 효율을 높이는 기술이다.
구현은 운영체제 커널에서 수행하는 방식, 메모리 컨트롤러에서 처리하는 하드웨어 방식, 그리고 소프트웨어와 하드웨어를 결합한 하이브리드 방식으로 나뉜다.
| 구현 방식 | 내용 | 예시 |
|---|---|---|
| 커널 레벨 | 운영체제 커널에서 압축 수행 | Linux zswap, zram |
| 하드웨어 | 메모리 컨트롤러에서 압축 | IBM MXT |
| 하이브리드 | 소프트웨어와 하드웨어 결합 | 일부 모바일 SoC |
Linux에서는 zswap과 zram이 대표적이다. zswap은 스왑 아웃되는 페이지를 디스크 대신 압축 메모리 풀에 보관하고, 기존 스왑 장치와 연동한다. LZO, LZ4, zstd 등을 압축 알고리즘으로 사용하며 디스크 I/O를 줄여 응답성을 높인다.
zram은 압축된 RAM 기반 블록 장치를 만들고 이를 스왑 공간으로 사용한다.
| 알고리즘 | 압축률 | 속도 | CPU 사용량 |
|---|---|---|---|
| LZO | 중간 | 매우 빠름 | 낮음 |
| LZ4 | 중간 | 매우 빠름 | 낮음 |
| zstd | 높음 | 빠름 | 중간 |
| DEFLATE | 높음 | 느림 | 높음 |
압축 메모리는 일반적으로 유효 메모리 용량을 2-3배 늘리고, 디스크 스왑 I/O와 디스크 접근에 따른 전력 소비를 줄일 수 있다. 반면 CPU 오버헤드가 늘고, 압축할 수 없는 데이터에는 효과가 없으며, 압축 해제 지연과 복잡성도 고려해야 한다.
과할당 정책과 OOM Killer
메모리 과할당(Memory Overcommitment)은 실제 물리 메모리보다 많은 가상 메모리를 프로세스에 할당하는 방식이다.
| 정책 | 내용 | Linux 설정 |
|---|---|---|
| 항상 허용 | 모든 할당 요청 승인 | vm.overcommit_memory=1 |
| 휴리스틱 | 합리적 범위 내 허용 | vm.overcommit_memory=0 |
| 엄격 제한 | 물리+스왑 범위로 제한 | vm.overcommit_memory=2 |
물리 메모리와 스왑이 모두 소진되면 OOM(Out of Memory) Killer가 프로세스를 강제 종료한다.
스레싱은 워킹셋과 PFF로 제어할 수 있고, 페이지 크기는 워크로드의 특성에 맞춰 선택해야 한다. 메모리 압축과 과할당 정책은 물리 메모리 압박을 다루는 보완 수단이며, 이들이 함께 안정적이고 효율적인 시스템 운영을 뒷받침한다.