메모리가 모자라면 리눅스는 잘 안 쓰는 페이지를 스왑으로 내보낸다. 문제는 그 스왑이 보통 디스크라는 점이다. 디스크 스왑이 활발해지는 순간 시스템은 눈에 띄게 버벅인다. zram은 이 스왑을 디스크가 아니라 압축된 RAM에 둔다. 페이지를 디스크에 쓰는 대신 RAM 안에서 압축해 보관한다.

거래는 단순하다. CPU를 조금 더 써서 압축·해제하는 대가로 디스크 I/O를 RAM 접근으로 바꾼다. 텍스트성 데이터는 보통 2:1~4:1로 압축되므로, 스왑으로 나간 만큼의 물리 RAM을 절반 이하로 되돌려 받는 효과가 있다.

현재 스왑 확인

zram이 무엇을 대체하는지 보려면 현재 스왑이 어디에 있는지부터 확인한다.

swapon --show
NAME      TYPE SIZE USED PRIO
/swap.img file   4G   4G   -1

이 머신의 스왑은 4GB짜리 디스크 파일(/swap.img)이고 우선순위는 -1이다. 스왑이 쓰일 때마다 페이지가 디스크를 오간다는 뜻이다. free -h로 보면 그 스왑이 이미 꽉 차 있다.

               total        used        free      shared  buff/cache   available
Mem:            38Gi        29Gi       447Mi       1.0Gi       9.3Gi       8.2Gi
Swap:          4.0Gi       4.0Gi       1.2Mi

zram이 하는 일은 여기에 우선순위가 더 높은 스왑 장치를 RAM 안에 하나 추가하는 것이다. 커널은 우선순위가 높은 스왑부터 쓰므로, 페이지는 디스크 파일(-1)보다 zram(보통 100)으로 먼저 나간다. 디스크 대신 압축 RAM이 1차 스왑이 된다.

zram은 압축된 스왑 블록 장치다

zram은 리눅스 커널이 제공하는 기능으로, RAM의 일부를 가상 블록 장치(/dev/zram0)로 만든다. 이 장치에 데이터를 쓰면 메모리에 저장되기 전에 압축되고, 읽을 때 다시 풀린다. 이 장치를 스왑으로 등록하면 스왑 페이지가 디스크가 아니라 압축 RAM으로 향한다.

압축 알고리즘은 LZO, LZ4, ZSTD 등을 고를 수 있다(zramctl이 보고하는 지원 목록: lzo, lz4, lz4hc, deflate, 842, zstd). Ubuntu는 속도와 압축률의 균형이 좋은 LZ4를 기본으로 쓴다. 압축이 빠른 만큼 디스크 I/O 대기보다 훨씬 짧은 지연으로 페이지를 되살린다.

Ubuntu에서 설치

Ubuntu에서는 zram-config 패키지 하나면 된다. 커널 모듈을 손으로 올리거나 스크립트를 짤 필요가 없다.

sudo apt install zram-config

설치하면 부팅 시 자동으로 zram 장치를 만들어 스왑으로 등록한다. 기본 구성은 다음과 같다.

  • zram 크기를 RAM의 약 50%로 설정 (압축되므로 실제 RAM 점유는 그보다 작다)
  • 압축 알고리즘은 LZ4
  • 스왑 우선순위를 100으로 — 디스크 스왑(-1/-2)보다 먼저 쓰이도록
  • 부팅 시 자동 활성화

대부분의 데스크톱 워크로드는 이 기본값으로 충분하다.

동작 확인과 압축률 읽기

설치 후 swapon --show를 다시 보면, 디스크 파일 위에 zram 장치가 더 높은 우선순위로 추가돼 있다.

swapon --show
# NAME       TYPE  SIZE  USED  PRIO
# /dev/zram0 partition  ...    100   ← 우선순위가 높아 먼저 사용됨
# /swap.img  file  4G    ...   -1

압축이 실제로 얼마나 되는지는 zramctl로 본다.

zramctl

컬럼의 의미는 다음과 같다.

컬럼의미
DISKSIZE장치에 담을 수 있는 압축 해제 기준 한계
DATA저장된 데이터의 압축 해제 크기 (원본 크기)
COMPR그 데이터가 실제로 차지하는 압축 후 크기
TOTAL메타데이터·단편화 오버헤드까지 포함한 실제 RAM 점유

압축률은 DATA ÷ COMPR로 읽는다. DATA가 1.2G인데 COMPR이 400M이라면 약 3:1로 압축된 것이고, 원래 1.2GB 분량이 RAM에서 400MB만 차지한다는 뜻이다. 실제 절약된 물리 RAM은 DATA − TOTAL이다.

언제 효과가 크고, 언제 작은가

zram은 스왑이 실제로 쓰이는 상황에서만 의미가 있다. 페이지가 디스크로 나가던 것을 압축 RAM으로 돌리는 게 핵심이기 때문이다.

  • 효과가 큰 곳: RAM 8GB 이하, 브라우저 탭을 많이 띄우는 패턴, 메모리를 많이 먹는 IDE·VM. 디스크 스왑으로 인한 버벅임이 압축 RAM 접근으로 바뀐다.
  • 효과가 작은 곳: RAM이 충분해(예: 32GB+) 스왑이 거의 안 쓰이는 시스템. 스왑 자체가 발생하지 않으면 zram이 개입할 일도 없다.

CPU 비용은 생각보다 작다. 압축·해제 오버헤드는 보통 한 자릿수 퍼센트 수준이고, 그 대가로 사라지는 디스크 I/O 대기 시간이 훨씬 크다. 다만 CPU가 이미 100%로 포화된 워크로드라면 압축 비용이 부담이 될 수 있다.

하이버네이션이 필요하면 zram이 아니라 zswap을 봐야 한다. zram은 순수 RAM이라 전원이 꺼지면 내용이 사라진다. zswap은 압축 캐시 역할을 하면서 필요할 때 디스크 스왑으로 내보낼 수 있어, 디스크 스왑 위에서 동작하는 절전과 함께 쓸 수 있다.