zram și zswap

zram și zswap

Swap-ul clasic pe disc rezolvă problema lipsei de RAM, dar introduce o latență semnificativă - mai ales pe HDD-uri mecanice. Fiecare operație de swapping in înseamnă o citire de pe disc, care poate dura câteva milisecunde, suficient cât să facă un sistem cu puțin RAM să se simtă lent și neplăcut. zram și zswap sunt două soluții diferite la aceeași problemă: în loc să pagineze pe disc, comprimă paginile de memorie și le păstrează tot în RAM.

zram vs zswap - care e diferența

Deși par similare, zram și zswap funcționează diferit și se potrivesc unor scenarii diferite.

zram creează un dispozitiv de tip bloc în RAM care funcționează ca swap. Paginile de memorie sunt comprimate și stocate tot în RAM, fără niciun acces la disc. Dacă zram-ul se umple, kernelul nu mai are unde să pagineze (cu excepția cazului în care există și swap pe disc configurat ca fallback). Este soluția preferată pe desktop-uri, laptopuri și dispozitive cu stocare lentă sau limitată.

zswap funcționează ca un cache comprimat în RAM între procesele active și swap-ul pe disc. Când kernelul vrea să pagineze o pagină pe disc, zswap o interceptează, o comprimă și o păstrează în RAM. Numai când cache-ul zswap se umple, paginile sunt scrise efectiv pe disc. zswap necesită swap pe disc configurat și funcționează ca o optimizare a acestuia, nu ca înlocuitor.

zram zswap
Necesită swap pe disc Nu Da
Stochează date Doar în RAM RAM (cache) + disc (overflow)
Potrivit pentru Desktop, sisteme fără disc rapid Servere, sisteme cu swap existent
Complexitate Simplă Moderată

Pe un desktop sau laptop, zram este alegerea naturală - elimină aproape complet accesele la disc pentru swap și face sistemul mai responsiv chiar și cu puțin RAM. Pe un Raspberry Pi sau alt dispozitiv cu card microSD, zram face diferența dintre un sistem utilizabil și unul care scrie constant pe card, reducând și uzura acestuia.

Pe un server cu SSD rapid și swap existent, zswap poate reduce semnificativ numărul de accese la disc fără să necesite reconfigurarea completă a setup-ului de memorie.

Algoritmi de compresie

Atât zram cât și zswap folosesc algoritmi de compresie pentru a reduce dimensiunea paginilor. Algoritmii disponibili depind de configurația kernel-ului, dar pe distribuțiile moderne sunt de obicei disponibili:

  • lzo și lzo-rle - rapizi, compresie moderată, folosiți implicit pe multe sisteme
  • lz4 - cel mai rapid, compresie ceva mai slabă decât lzo, ideal pentru sisteme unde viteza contează mai mult decât rata de compresie
  • zstd - cel mai bun echilibru între viteză și compresie, recomandat pe kerneluri recente (5.x+)
  • deflate - compresie bună, mai lent, rar folosit pentru swap

Verifici algoritmii disponibili pe sistemul tău:

cat /sys/block/zram0/comp_algorithm
# sau pentru zswap:
cat /sys/module/zswap/parameters/compressor

Algoritmul între paranteze drepte este cel activ în momentul respectiv.

zram

Activare pe distribuții moderne

Pe Ubuntu 22.04+, Fedora și multe alte distribuții moderne, zram este deja configurat și activ implicit printr-un serviciu numit zram-generator sau zramswap. Verifici dacă e activ:

swapon --show

Dacă există o linie cu /dev/zram0 de tip partition, zram e deja funcțional.

Instalare și configurare manuală

Pe distribuțiile unde zram nu e configurat implicit, poți folosi zram-generator (recomandat) sau să îl configurezi manual.

Cu zram-generator

Instalezi pachetul:

# Ubuntu/Debian
apt install systemd-zram-generator
 
# Fedora
dnf install zram-generator
 
# Arch Linux
pacman -S zram-generator

Creezi fișierul de configurare /etc/systemd/zram-generator.conf:

[zram0]
zram-size = ram / 2
compression-algorithm = zstd

ram / 2 înseamnă că zram va folosi jumătate din RAM-ul fizic ca dimensiune maximă (după compresie, stochează efectiv mai mult). Poți specifica și o valoare fixă, de exemplu zram-size = 2048 pentru 2GB.

Activezi serviciul:

systemctl daemon-reload
systemctl start systemd-zram-setup@zram0.service

Verifici că e activ:

swapon --show
zramctl

Manual, fără zram-generator

Încarci modulul:

modprobe zram

Setezi algoritmul de compresie:

echo zstd > /sys/block/zram0/comp_algorithm

Setezi dimensiunea (exemplu 2GB):

echo 2G > /sys/block/zram0/disksize

Formatezi și activezi ca swap:

mkswap /dev/zram0
swapon --priority 100 /dev/zram0

Prioritatea 100 asigură că zram este folosit înaintea oricărui swap pe disc.

Dimensiunea recomandată pentru zram

O regulă practică este să setezi zram la jumătate din RAM-ul fizic. Datorită compresiei (raport tipic de 2:1 până la 3:1 pentru paginile obișnuite), un zram de 2GB poate stoca efectiv 4-6GB de date comprimate. Pe sisteme cu foarte puțin RAM (512MB - 1GB), poți seta zram egal cu RAM-ul fizic, deși dincolo de acest punct randamentul scade.

RAM fizic zram recomandat
512MB 512MB
1GB 512MB - 1GB
2GB 1GB
4GB 2GB
8GB+ 2-4GB

Dezactivare zram

swapoff /dev/zram0
modprobe -r zram

zswap

Activare

zswap este un modul al kernel-ului și pe multe distribuții este deja compilat, dar dezactivat implicit. Verifici starea:

cat /sys/module/zswap/parameters/enabled

Dacă returnează N, zswap e dezactivat. Activezi temporar:

echo Y > /sys/module/zswap/parameters/enabled

Pentru activare permanentă, adaugi parametrul la linia de boot a kernel-ului. Pe sistemele cu GRUB, editezi /etc/default/grub și adaugi la GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=20"

Actualizezi GRUB:

# Ubuntu/Debian
update-grub
 
# Fedora/RHEL
grub2-mkconfig -o /boot/grub2/grub.cfg
 
# Arch Linux
grub-mkconfig -o /boot/grub/grub.cfg

Parametrii importanți

max_pool_percent controlează ce procent maxim din RAM poate folosi zswap ca cache. Valoarea implicită este 20%, ceea ce pe un sistem cu 4GB RAM înseamnă 800MB pentru cache-ul zswap. Dacă sistemul tău are swap pe SSD rapid, o valoare mai mică (10%) poate fi suficientă. Pe sisteme cu HDD lent, o valoare mai mare (30-40%) reduce mai mult accesele la disc.

# Modifici temporar
echo 20 > /sys/module/zswap/parameters/max_pool_percent

zpool controlează alocatorul de memorie folosit de zswap. Opțiunile sunt zbud (mai simplu, mai puțin eficient) și z3fold sau zsmalloc (mai eficiente, recomandate):

echo z3fold > /sys/module/zswap/parameters/zpool

Monitorizare zswap

grep -r . /sys/kernel/debug/zswap/ 2>/dev/null

Valorile relevante sunt:

  • pool_pages - paginile stocate în cache-ul zswap
  • written_back_pages - paginile care au depășit cache-ul și au fost scrise pe disc
  • pool_total_size - dimensiunea totală a pool-ului

Dacă written_back_pages crește rapid, cache-ul zswap e prea mic față de presiunea pe memorie și merită mărit max_pool_percent.

Nu folosi zram și zswap simultan

zram și zswap nu sunt proiectate să funcționeze împreună și combinația lor poate cauza comportament impredictibil. Dacă activezi zram, dezactivează zswap și invers. Alege una din soluții în funcție de scenariul tău:

  • Desktop, laptop, Raspberry Pi, VPS fără swap pe disc → zram
  • Server cu swap existent pe SSD/HDD → zswap

Comparație cu swap clasic

Pe un sistem cu SSD NVMe, diferența dintre zram și swap pe disc poate fi mai mică decât pe HDD, dar zram rămâne mai rapid în aproape toate scenariile deoarece accesul la RAM este cu câteva ordine de mărime mai rapid decât orice dispozitiv de stocare.

Un test practic pe un sistem cu 4GB RAM și zram configurat cu zstd arată de obicei:

  • Rată de compresie: 2:1 până la 3:1 pentru pagini tipice
  • Latență swapping: microsecunde (zram) vs milisecunde (SSD) vs zeci de milisecunde (HDD)

Resurse suplimentare

  • Swap pe Linux - articolul principal despre swap, partiții și fișiere swap
  • OOM Killer - ce se întâmplă când nici swap-ul nu mai ajunge