zram mais swapfile: duas camadas de swap num Debian com 8 GB
Por Tiago + SkyNet · 22 de setembro de 2026
Duas camadas de memória — zram e swapfile — empilhadas e ligadas por fluxos de dados
Este blog tem o nome que tem porque quase tudo aqui nasce com um café ao lado. Este artigo nasceu de um problema mais mundoso: um portátil com 8 GB de RAM, o Debian, e a pergunta de sempre — preciso de swap? Com quanto? Em disco ou em RAM?
O problema do swap clássico
Swap em disco é lenta por definição. Num SSD NVMe até engana, mas apanha dez páginas de RAM por segundo no pior momento possível: quando o sistema já está a sufocar. O truque clássico é baixar a swappiness para o kernel quase ignorar o swap. Funciona, mas é um esforço para evitar uma coisa que, bem feita, até ajuda.
zram: swap comprimida em RAM
O zram faz o contrário: cria um dispositivo de bloco na RAM que funciona como swap, comprimindo tudo o que lá entra. A memória “perdida” pelo swap passa a ser comprimida em vez de escrita em disco, e o acesso é ordens de magnitude mais rápido que qualquer SSD.
No Debian, o pacote é systemd-zram-generator, e a configuração é um único ficheiro:
# /etc/systemd/zram-generator.conf
[zram0]
zram-size = min(min(ram, 4096) + max(ram - 4096, 0) / 2, 32 * 1024)
zram-resident-limit = ram / 4
compression-algorithm = zstd
swap-priority = 100
A fórmula do zram-size vem do upstream: os primeiros 4 GB de RAM contam a 100%, o resto a 50%, com tecto de 32 GB. Neste host de 7,7 GB dá um dispositivo de 5,8 GB.
Duas linhas merecem explicação:
zram-resident-limit = ram / 4é o travão de segurança: a swap comprimida nunca ocupa mais de 25% da RAM física. Sem ele, uma carga com dados pouco comprimíveis (vídeos, dados já comprimidos) pode encher o dispositivo e competir com a própria carga por memória — espiral de morte por falta de RAM.swap-priority = 100dá a prioridade do dispositivo: o kernel usa sempre o swap de prioridade mais alta primeiro. O zram fica à frente de tudo.
O zramctl mostra o efeito real no meu caso:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 5.8G 549.4M 120M 124.9M [SWAP]
549 MB de dados ocupam 125 MB de RAM. Razão de compressão de ~4,4:1. Isso significa que o zram está a dar-me ~4,4 GB de espaço de swap a custo de 125 MB de RAM. Nenhum SSD faz isso.
A segunda camada: swapfile em disco
O zram tem um limite físico óbvio: só tem 5,8 GB, e a memória comprimida ocupa RAM. Se a carga passar o dispositivo, sem segunda camada o OOM killer entra. A solução barata é um swapfile em disco com prioridade baixa:
# /etc/fstab — camada lenta (segunda linha de defesa)
/swapfile none swap sw,pri=10 0 0
Criar o swapfile é o ritual de sempre:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
O swapon –show mostra as duas camadas e quem estão a ser usadas:
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B 10
/dev/zram0 partition 5.8G 633.3M 100
O zram tem 633 MB em uso; o swapfile está a 0. É exatamente o comportamento desejado: o kernel esgota a camada rápida antes de tocar no lenta.
swappiness=100 (sim, a subir)
Aqui entra a parte contraintuitiva. Todos os guias dizem: swappiness=10, o kernel evita swap. Mas esses guias assumem que swap é lenta. Com zram, swap é rápida — e deixar as páginas menos usadas irem dormir comprimidas em RAM liberta memória para cache de ficheiros, que é onde os sistemas Linux ganham desempenho.
Neste host a swappiness está em 100, e o sistema está vivo e agradável:
cat /proc/sys/vm/swappiness # 100
A regra prática: zram com swappiness alta funciona bem. Swap em disco com swappiness alta, não. O valor 100 empurra as páginas frias para o zram cedo, o que é bom quando o destino é comprimido e rápido.
Quando não fazer isto
O zram não é magia universal. Se o teu consumo real ultrapassa sistematicamente o que a compressão consegue, vai acabar no swapfile tão ou mais vezes que no zram, e o disco torna-se o gargalo outra vez. Nesse caso o problema é a RAM, e o zram só adia a conversa com o orçamento.
Também vale atenção em sistemas muito curtos de RAM (raspberries antigos, VPS pequenos): o zram-generator é elegante mas não contorna pouca RAM — só a usa melhor.
Resumo
- zram-generator + fórmula de upstream: dispositivo de ~6 GB num sistema de 8 GB
- zram-resident-limit como travão físico (25% da RAM)
- swapfile em disco como segunda camada, com prioridade baixa (pri=10)
- swappiness=100 quando a camada principal é zram
- compressão medida: 549 MB de dados em 125 MB de RAM (~4,4:1)
Tudo isto numa máquina que já se habituou a viver com menos RAM do que as aplicações querem. Funciona.
Tags: #linux #debian #memoria