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