Aumente a memória disponível no Linux com a zRam
Autor: Davidson Paulo | Publicado: 2012-09-03T11:00:00-03:00






A zRam, antigamente conhecida como compcache, é um recurso do kernel Linux que permite utilizar uma porção da memória RAM do sistema para armazenar dados compactados. Dessa forma, um número maior de informações pode ser armazenado com a mesma quantidade de memória, provocando o efeito aparente de aumento da quantidade de memória disponível.

O uso da zRam no Linux depende de um módulo do kernel que ainda está na árvore staging, portanto ainda não é considerado estável e não vem instalado por padrão na maioria das distribuições Linux. No Fedora 17, é possível instalá-lo e integrá-lo ao sistema de maneira relativamente simples, e o processo você confere aqui.

ATENÇÃO: os procedimentos abaixo foram testados no Fedora 17 x86_64 e podem não funcionar em versões diferentes do Fedora ou em outras distribuições. Para instruções mais genéricas, recomendo este artigo do IBM developerWorks.

Primeiramente, certifique-se de ter habilitado o repositório de pacotes RPM Fusion. Basta instalar o pacote rpmfusion-free-release-stable.noarch.rpm com o comando rpm e depois usar o Yum para instalar o pacote kmod-staging:

# rpm -Uvh rpmfusion-free-release-stable.noarch.rpm
# yum -y install kmod-staging

ATENÇÃO: Quando instalar o pacote kmod-staging, observe se o pacote kernel será atualizado. Se for, será necessário reiniciar o computador, iniciando o Fedora com a versão mais recente do kernel Linux recém-instalada.

Concluída essa etapa, verifique se o módulo zram está disponível:

$ modinfo zram
filename:       /lib/modules/3.5.2-3.fc17.x86_64/extra/staging/zram.ko
description:    Compressed RAM Block Device
author:         Nitin Gupta 
license:        Dual BSD/GPL
depends:        
vermagic:       3.5.2-3.fc17.x86_64 SMP mod_unload 
parm:           num_devices:Number of zram devices (uint)

Em caso positivo, carregue o módulo e veja se o dispositivo /dev/zram0 é criado:

# modprobe zram
# ls -l /dev/zram0
brw-rw----. 1 root disk 252, 0 Ago 27 10:51 /dev/zram0

Em seguida, configure a quantidade de memória RAM que será disponibilizada para o dispositivo de memória compactada. Você pode utilizar até 100% do total de memória RAM disponível, entretanto é interessante que você deixe um espaço que não utilize compactação, que possa ser usado para gravar dados de processos de alta prioridade. Esse espaço pode ser igual ao definido pelo parâmetro do kernel vm.min_free_kbytes, que pode ser visto com o comando sysctl:

$ sysctl vm.min_free_kbytes
vm.min_free_kbytes = 67584

O valor acima precisa ser multiplicado por 1024 para ser convertido em bytes, e então o subtraímos do total de memória RAM disponível no sistema. Para poupar o seu tempo, o comando abaixo calcula e exibe o tamanho ideal da área de memória compactada :

$ echo $(( $(free -b | sed -n 2p | awk '{ print $2 }') -
  $(sysctl vm.min_free_kbytes | awk '{ print $3 }') * 1024 ))
4031680512

Anote o valor mostrando na tela e grave-o no arquivo /sys/block/zram0/disksize:

# echo 4031680512 > /sys/block/zram0/disksize

Para concluir, configure o dispositivo /dev/zram0 para ser uma unidade de área de troca (memória virtual ou swap) e habilite-a com alta prioridade:

# mkswap /dev/zram0
# swapon -p 1024 /dev/zram0

Uma vez que a zRam tenha sido habilitada, o sistema continuará utilizando a memória da mesma maneira, isto é, gravará todos os dados na memória até que não haja mais espaço disponível. Quando isso acontecer, o sistema moverá os dados menos utilizados para a área de troca (swap). Só que agora, a área de troca não está mais no disco rígido e sim na própria memória, porém usando compressão de dados através da zRam. Então, na prática, o sistema vai compactando dinamicamente os dados menos acessados, liberando espaço na memória RAM.

Por causa disso, é interessante que o sistema operacional procure jogar os dados antigos para a área de troca sempre que possível, e não somente quando necessário. Para fazer isso, basta ajustar o parâmetro de kernel vm.swappiness para o valor máximo, que é 100:

# sysctl -w vm.swappiness=100

A pergunta que fica agora é: "afinal, o quanto isso pode ajudar o sistema?" Partindo do princípio que memória nunca é demais, a zRam pode ajudar exatamente fazendo com que possamos armazenar, no mesmo espaço físico, uma quantidade maior de dados, e isso vai depender da taxa de compressão alcançada. Para calcular o ganho de memória com a zRam, a lógica é simples. Analise os comandos abaixo (alguns trechos  foram suprimidos por questões de formatação):

$ free -k
             total       used
Mem:       4004772    3866344
-/+ buffers/cache:    3676460
Swap:     10099612    1200496

$ swapon -s
Filename    Type      Size    Used
/dev/sda5   partition 6094844 0
/dev/zram0  partition 4004768 1200496

Aqui, podemos ver que estão sendo utilizados 3866344KB de memória real e 1200496KB de memória virtual, totalizando 5066840KB de dados armazenados. Acontece que, conforme vemos na saída do comando swapon -s, 100% dos dados armazenados na memória virtual estão gravados no dispositivo zRam e, portanto, estão armazenados na memória real, usando compactação. Portanto, a memória real está armazenando 5066840KB de dados. Entretanto, vemos na saída no comando free -k que só existem 4004772KB de memória real disponíveis. Assim, fica comprovado que a zRam consegue fazer a memória real armazenar mais dados do que ela originalmente suporta.

Apenas a título de curiosidade, se você quiser saber o percentual de performance da zRam, ou seja, em que proporção ele aumentou a capacidade da memória RAM, basta dividir a quantidade de dados armazenados na zRam pela quantidade de dados usados na memória real e multiplicar por 100. No exemplo acima, o aumento foi de 35% (1200496 / 3866344 x 100).

Sempre que você quiser verificar o desempenho atual da zRam, pode executar o comando abaixo.

$ echo $(( $(swapon -s | awk '$1 == "/dev/zram0" { print $4 }') 
  * 100 / $(free -k | sed -n 2p | awk '{ print $3 }') ))%

Para finalizar, gostaria de mostrar como integrar a zRam ao Fedora, para que ela seja habilitada junto com o sistema. Para isso, faça o download dos arquivos zram.init e zram.service. Copie o arquivo zram.init para dentro do diretório /usr/libexec e o arquivo zram.service para dentro do diretório /lib/systemd/system. Depois, crie o arquivo /etc/sysconfig/zram, contendo a definição de uma variável chamada SWAPPINESS, habilite a inicialização do serviço zram e inicie-o, executando os comandos abaixo.

# echo SWAPPINESS=$(sysctl vm.swappiness | awk '{ print $3 }') > /etc/sysconfig/zram
# systemctl enable zram.service
# systemctl start zram.service

Feito isso, a zRam será habilitada quando o sistema for inicializado. Se você quiser, pode adaptar o script zram.init de forma que ele funcione para outras distribuições diferentes do Fedora.

Espero que goste dessa dica. Fique à vontade para dar a sua opinião nos espaço de comentários. Um grande abraço e até a próxima!


    lastnextpost('2012/08/como-se-conectar-a-uma-vpn-checkpoint-a-partir-do-linux.html',
                 '2012/11/hyperic-hq-monitore-sua-rede-like-a-boss.html');