Ryotta's Basic

Linux
🐧 Linux 검증완료

소프트웨어 메모리 압축

개요

소프트웨어 메모리 압축은 운영체제 커널 수준에서 메모리 페이지를 압축하여 물리적 RAM 용량을 가상으로 확장하는 기술입니다. 하드웨어 압축 엔진 없이 CPU의 일반적인 연산 자원만으로 압축/해제를 수행하며, zRAM, zswap, 투명 압축(transparent compression) 같은 메커니즘을 통해 실제 디스크 swap I/O를 크게 줄여 시스템 성능을 향상시킵니다.

이 문서는 소프트웨어 메모리 압축의 핵심 기술인 zRAM과 zswap의 동작 원리, 압축 알고리즘 비교, 운영 설정 방법을 정리합니다. 또한 하드웨어 압축 대비 장단점과 실제 사용 사례를 통해 어떤 상황에서 소프트웨어 압축이 효과적인지를 분석합니다.

소프트웨어 메모리 압축 개요

그림 1. 소프트웨어 메모리 압축 기술 분류와 적용 계층

핵심 개념

zRAM

zRAM은 RAM 내에 압축 블록 디바이스를 생성하는 Linux 커널 모듈입니다. 이 디바이스는 일반적인 블록 디바이스처럼 동작하지만, 데이터가 실제로 디스크에 기록되지 않고 RAM에 압축되어 저장됩니다. zRAM은 주로 swap 디바이스로 사용되며, /tmp 같은 임시 파일 시스템에도 활용됩니다.

  • Linux 3.14부터 메인라인에 포함되어 안정적으로 사용되고 있습니다.
  • 압축 알고리즘으로 LZ4, LZO-RLE, ZSTD 등을 지원하며, Linux 5.1부터 기본값은 LZO-RLE입니다.
  • swap으로 사용 시 동일한 RAM 용량에 2~5배 더 많은 페이지를 저장할 수 있습니다.
  • 디스크 I/O를 완전히 제거하여 SSD 수명 연장과 시스템 성능 향상에 기여합니다.
  • Android에서는 RAM Plus, Extended RAM 등 다양한 이름으로 상용화되어 있습니다.

zswap

zswap은 swap out 과정에서 페이지를 압축하여 RAM 기반 캐시에 저장하는 경량 압축 캐시입니다. zRAM과 달리 별도의 블록 디바이스를 생성하지 않고, swap 서브시스템과 직접 통합되어 투명하게 동작합니다.

  • swap out되는 페이지를 자동으로 압축하여 메모리 풀에 저장합니다.
  • 풀이 가득 차면 LRU 기반으로 콜드 페이지를 백업 swap 디바이스에 기록합니다.
  • zsmalloc 메모리 할당자를 사용하여 압축된 데이터의 메모리 효율을 최적화합니다.
  • swap entry와 압축된 페이지 핸들 간 매핑은 swap type별 xarray로 관리합니다.
  • max_pool_percent로 압축 풀 상한을 제어하고, accept_threshold_percent로 풀이 포화된 뒤 다시 수용을 시작할 시점을 조절합니다.
  • 커널 시작 시 CONFIG_ZSWAP_DEFAULT_ON으로 기본 활성화할 수 있습니다.

투명 압축 (Transparent Compression)

투명 압축은 파일 시스템이나 메모리 관리 계층에서 압축을 자동으로 수행하는 기술입니다. 사용자나 응용 프로그램의 개입 없이 OS가 투명하게 압축/해제를 처리합니다.

  • Btrfs와 F2FS는 파일 시스템 수준에서 투명 압축을 지원합니다.
  • Linux 커널의 zpool 인터페이스를 통해 다양한 압축 백엔드를 통합합니다.
  • 메모리 관리에서 페이지를 압축하여 swap out 전에 먼저 압축을 시도합니다.
  • I/O 오버헤드를 줄이면서 메모리 효율성을 높이는 것이 목표입니다.

운영 포인트

  • zRAM은 comp_algorithm, disksize, mem_limit 같은 sysfs 노드로 압축 알고리즘과 용량 상한을 조정합니다.
  • zRAM은 mm_stat, io_stat, bd_stat로 실제 압축률, 메모리 사용량, backing device writeback량을 관찰할 수 있습니다.
  • zswap은 필요할 때만 풀이 커지는 on-demand 구조라, 미리 큰 풀을 예약하지 않습니다.
  • zswap은 cgroup의 memory.zswap.writeback 제어와 shrinker 옵션을 통해 writeback 적극성을 워크로드별로 다르게 가져갈 수 있습니다.

비교/분석

기술 원리 압축률 지연시간 CPU 사용 적합한 워크로드
zRAM RAM 내 압축 블록 디바이스 2:1~5:1 10~50μs 중간 모바일, 임베디드, 클라우드
zswap swap out 시 압축 캐시 2:1~4:1 10~100μs 중간 데스크톱/노트북, 과부하 서버
하드웨어 압축 전용 압축 엔진 2:1~4:1 ~1ns 거의 없음 메인프레임, 고성능 서버
디스크 swap 물리적 디스크 기록 없음 1~10ms 거의 없음 범용 (성능 저하)

동작 원리

zRAM 동작 흐름

  1. 응용 프로그램이 메모리 페이지를 사용하지 않으면, 커널은 해당 페이지를 swap out 대상으로 표시합니다.
  2. zRAM 드라이버가 페이지를 받아 선택된 압축 알고리즘(LZ4 등)으로 압축합니다.
  3. 압축된 데이터는 zRAM 블록 디바이스의 메모리 할당자에 저장됩니다.
  4. 읽기 요청이 오면, zRAM이 압축된 데이터를 찾아 해제하여 원래 페이지를 복원합니다.
  5. 복원된 페이지는 해당 프로세스의 주소 공간에 매핑됩니다.
쓰기 경로:
  Process Memory → Kernel Swap → zRAM Compress → Compressed RAM Pool

읽기 경로:
  Compressed RAM Pool → zRAM Decompress → Process Memory

zswap 동작 흐름

  1. 커널이 페이지를 swap out하려 할 때, zswap이 해당 페이지를 수신합니다.
  2. zswap이 페이지를 압축하여 동적으로 할당된 메모리 풀에 저장합니다.
  3. swap entry와 zsmalloc 핸들 간의 매핑을 xarray로 관리합니다.
  4. 풀이 가득 차면 LRU 기반으로 콜드 페이지를 백업 swap 디바이스에 기록합니다.
  5. 페이지 폴트 시 zswap load 함수가 페이지를 해제하여 메모리에 복원합니다.
swap out 경로:
  Page Fault → Swap Subsystem → zswap Compress → zsmalloc Pool

swap in 경로:
  zsmalloc Pool → zswap Decompress → Page Fault Handler → Process Memory

운영 관점에서의 선택 기준

  • 디스크 swap 자체를 거의 대체하고 싶다면 zRAM이 적합하고, 기존 swap 장치를 유지하면서 swap I/O만 줄이고 싶다면 zswap이 더 자연스럽습니다.
  • CPU 여유가 충분하고 SSD 쓰기를 줄이고 싶을수록 소프트웨어 압축의 효과가 커집니다.
  • 압축률이 낮은 워크로드에서는 zRAM의 huge_pages, zswap의 reject 통계처럼 비압축성 페이지 비율을 함께 확인해야 합니다.
  • 모바일/임베디드처럼 저장장치 쓰기 예산이 중요한 환경에서는 zRAM writeback과 zswap writeback 정책을 보수적으로 잡는 편이 일반적입니다.
zRAM/zswap 압축 흐름

그림 2. zRAM과 zswap의 압축/해제 흐름 비교

장단점

장점

  • 하드웨어 압축 엔진이 필요 없어 모든 플랫폼에서 사용 가능합니다.
  • SSD/Swap 디스크의 쓰기 횟수를 크게 줄여 수명을 연장합니다.
  • 물리적 RAM 용량을 가상으로 확장하여 더 많은 프로세스를 동시에 실행할 수 있습니다.
  • 디스크 swap 대비 지연시간이 수십~수백 배 낮아 시스템 반응성을 유지합니다.
  • 모바일/임베디드 장치에서 배터리 수명과 성능을 동시에 향상시킵니다.
  • Android에서 RAM Plus 같은 기능으로 사용자 경험을 개선합니다.

단점

  • 압축/해제에 CPU 리소스를 사용하여 다른 워크로드에 영향을 줄 수 있습니다.
  • 무작위 데이터나 이미 압축된 파일은 압축률이 거의 없어 공간 효율이 떨어집니다.
  • zRAM은 백업 스토리지 없이 사용 시 메모리 부족 상황에서 데이터 손실 위험이 있습니다.
  • 압축 알고리즘 선택에 따라 성능과 압축률 간 트레이드오프가 발생합니다.
  • 과도한 압축은 CPU 사용량을 증가시켜 전체 시스템 성능을 저하시킬 수 있습니다.
  • 메모리 할당자(zsmalloc)의 조각화로 인해 실제 사용 가능한 용량이 제한될 수 있습니다.

관련 기술

핵심 정리

소프트웨어 메모리 압축은 zRAM과 zswap을 통해 RAM 내에서 데이터를 압축하여 물리적 메모리 용량을 가상으로 확장하는 기술입니다. 하드웨어 압축 엔진 없이도 CPU 리소스를 사용하여 디스크 swap I/O를 크게 줄이며, 특히 모바일, 임베디드, 과부하 서버 환경에서 효과적입니다. LZ4, LZO-RLE, ZSTD 같은 압축 알고리즘을 통해 성능과 압축률 간 균형을 맞추며, SSD 수명 연장과 시스템 반응성 향상에 기여하지만, CPU 오버헤드와 데이터 패턴에 따른 압축률 변동이라는 한계가 있습니다.