Sobre swap e zram no Fedora Linux

Fernando_linuxbr
editado March 18 em Tutoriais

Neste artigo, irei falar sobre o zram, o que ele faz e algumas dicas para melhorar o desempenho no seu sistema. Antes de explicar o que de fato é a zram, preciso explicar o que é a troca de memória, ou swap, como é conhecida em inglês.

A swap é um recurso do sistema operacional que pega páginas¹ de memória RAM que não estão sendo usadas com frequência no sistema e as move para uma partição no disco. Ao transferir esses dados da memória RAM para o disco, o sistema libera mais memória RAM que fica disponível para as aplicações. No entanto, isso tem um custo. Mesmo com unidades mais rápidas disponíveis hoje em dia, como SSDs, o processo de recuperar essa memória que foi movida para lá é lento, pois as unidades de disco, mesmo as mais velozes, ainda são mais lentas se comparadas à memória RAM. Portanto, o desempenho ruim é evidente.

Veja na imagem acima, O sistema operacional troca, lembre-se swap é troca em inglês, entre dois dispositivos de memória diferentes, sendo um a memória RAM, enviando os dados para o disco rígido. O sistema operacional ao tentar recuperar essa memória da partição no disco leva muito tempo, fica perceptível a lentidão na máquina, indo até a pequenos engasgos.

O propósito do zram é criar um dispositivo de bloco dentro da memória RAM e usar esse dispositivo para swap, compactando os dados. Assim, o tempo para recuperar os dados da memória RAM é muito mais rápido do que no disco. Isso também tem um custo, pois os dados precisam ser descomprimidos, o que gera um custo de processamento. No entanto, bons algoritmos tornam o processo eficiente, melhorando o desempenho.

Vamos analisar uma imagem, resultado do comando:

zramclt

Na imagem acima temos o algoritmo utilizado “zstd”, depois em DISKSIZE o tamanho da zram que é de 8G, após em DATA temos o total de dados que está na zram 4K, porém em COMPR temos o fator de compressão, esses 4K foram comprimidos, ocupando um espaço de 64B.

Por padrão, o algoritmo de compressão no fedora é o lzo-rle que tem um bom desempenho no uso geral, porém o desempenho do zstd é melhor, deixarei um comando abaixo para você alterar o algoritmo para zstd, faça os testes e veja se há alguma diferença.

printf “%s\n” “[zram0]” “compression-algorithm = zstd” | sudo tee /etc/systemd/zram-generator.conf

Outro ponto interpresante sobre a zram no Fedora Linux, é que ele é calculado da seguinte forma, conforme esse arquivo de configuração.

cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# — size — same as available RAM or 8GB, whichever is less
# — compression — most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]
zram-size = min(ram, 8192)
compression-algorithm = zstd

Veja no arquivo de configuração como o cálculo é realizado, especificamente neste trecho:

zram-size = min(ram, 8192)

O cálculo acima funciona da seguinte maneira, é a mínima entre dois valores, por exemplo, tenho um sistema com 4GB de RAM total instalada:

zram-size = min(4GB, 8192)

Acima a mínima entre 4GB e 8GB que é padrão é 4GB, portando se você tiver 8GB ou menos de memória instalada, zram vai ser do mesmo tamanho da sua memória ram, agora se você conter 8GB ou mais, o valor da zram vai ser de 8GB.

Você pode alterar esse funcionamento, alterando o arquivo de configuração, e trocando o valor, por exemplo, na minha máquina eu tenho 4.7 GB de RAM instalada, e o mesmo valor em zram, como no print.

Quero que o total de zram não seja 4,7GB e sim apenas 2GB, para isso eu vou editar esse arquivo:

cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# — size — same as available RAM or 8GB, whichever is less
# — compression — most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]
zram-size = min(ram, 8192)
compression-algorithm = zstd

E mudar o 8192 para 2192.

zram-size = min(ram, 2192)

Vou salvar e reiniciar, e com o comando zramclt eu vou ver se houve alterações.

Veja que agora eu alterei o valor tendo apenas 2GB de memória ram disponível.