Economizando memória com o zRAM

- por Sergio Prado

Categorias: Linux Tags: ,

O zRAM (antes conhecido como compcache) é um recurso do kernel Linux para transformar uma região de memória RAM em um dispositivo de bloco com suporte à compressão de dados. Com este recurso, é possível criar uma espécie de disco virtual, onde os dados são armazenados em RAM de forma comprimida.

Alguns casos de uso interessantes para esta funcionalidade:

  1. Ponto de montagem para o armazenamento de informações temporárias, em substituição ao tmpfs, porém economizando RAM, já que as informações são armazenadas de forma comprimida.
  2. Região de SWAP, economizando RAM devido à compressão e melhorando a performance, já que não serão necessários ciclos de I/O para fazer paginação de memória em disco.

Este recurso ficou bastante tempo na área de staging do kernel, e foi promovido para o diretório drivers/block/zram na versão 3.14. Sua documentação está disponível no código-fonte do kernel em Documentation/blockdev/zram.txt. Para utilizá-lo, basta compilar o kernel com a opção CONFIG_ZRAM habilitada.

O zRAM disponibiliza um ou mais arquivos de dispositivo de bloco em /dev/zramX (X = 0, 1, 2, …). A quantidade de dispositivos criada pode ser configurada através do parâmetro num_devices (por padrão, é criado apenas um dispositivo do tipo zRAM).

$ ls -l /dev/zram*
brw-rw---- 1 root disk 251, 0 Mar 25 21:53 /dev/zram0

Cada dispositivo terá uma entrada no sysfs para possibilitar a configuração e exibição de estatísticas;

$ ls /sys/block/zram0
alignment_offset   disksize    mem_used_total  queue      slaves
bdi                ext_range   notify_free     range      stat
capability         holders     num_reads       removable  subsystem
compr_data_size    inflight    num_writes      reset      trace
dev                initstate   orig_data_size  ro         uevent
discard_alignment  invalid_io  power           size       zero_pages

O primeiro passo para utilizar esta funcionalidade é configurar o tamanho do disco. Por exemplo, para configurar um disco virtual de 512MB:

$ echo 512M > /sys/block/zram0/disksize

Para utilizar o zRAM como ponto de montagem para dados temporários (com suporte à compressão), é só formatar a partição e criar o ponto de montagem. Após executar os comandos abaixo, tudo o que for escrito no diretório /tmp será escrito de forma comprimida em RAM.

$ mkfs.ext4 /dev/zram0
$ mount /dev/zram0 /tmp

Uma outra funcionalidade interessante do zRAM é configurá-lo como um mecanismo de SWAP. Desta forma, é possível fazer paginação de memória em RAM, porém comprimida, economizando memória e evitando ciclos de I/O em disco.

$ mkswap /dev/zram0
$ swapon /dev/zram0

Na prática, o recurso de zRAM do kernel funciona como um mecanismo simples de compressão de dados em RAM para melhorar a eficiência e a responsividade de sistemas com recursos limitados de memória.

Atualmente, ele tem sido usado em netbooks como o Chromebook (Chrome OS) e smartphones Android, e pode ser uma boa solução para dispositivos embarcados com pouca memória RAM.

Um abraço,

Sergio Prado

  • Show de artigo Sergio.

    Fiz uns testes com o kernel 3.8 a um tempo e funcionava legal, tinha uns logs estranhos com Buffer I/O Error e não lembro o resto que era reportado.

    Agregando ao conteúdo postado, uma ferramenta legal para administrar é a zramctl no Buildroot habilitando util-linux tá incluso, no Yocto Project no 1.7 quando instalei o util-linux não possuía ainda.

    E um parâmetro bem legal é habilitar a compressão lzo acho que default é lz4, na época fiz testes e apresentou melhor compressão e ganho na velocidade de leitura.

    Cheguei a ler sobre zcache, chegou a usar ou testes Sergio?

    • Valeu pelas dicas Cleiton!

      Nunca usei o zcache, mas sei que ele funciona um pouco diferente, o acesso é por página de memória (em vez de byte a byte) e serve também para criar caches de acesso à sistemas de arquivos. Ele não é tão genérico como o zRAM.

  • Diego Sueiro

    Ótima informação.

    Sabe dizer se ele pode ser montado automaticamente pelo fstab?

    • Sem dúvida Diego! Ele é um block device e pode ser gerenciado pelo fstab normalmente.

      • Diego Sueiro

        Foi o que eu imaginei. Valeu

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.