Pesquisa de site

Otimizando o uso de memória do Linux


Na primeira parte desta série, examinamos mais de perto o espaço Swap, e a segunda parte tratou de ferramentas e comandos para gerenciar a memória. Agora, vamos discutir vários parâmetros e estratégias para otimizar a memória e seu uso em geral. Isso abrange a quantidade de memória, a aceleração do acesso e a estratégia de uso interno.

Quantidade de memória

Como já discutido na primeira parte, toda a memória é chamada de memória virtual e consiste em memória física e espaço de troca. A disponibilidade da memória física depende do hardware embutido na máquina, bem como da quantidade de memória que o processador pode endereçar, na verdade. Por exemplo, sistemas operacionais de 32 bits têm um limite de 4 G de memória, apenas (2^32 bits), enquanto sistemas operacionais baseados em 64 bits teoricamente permitem até 16 EB (2^64 bits).

Para ser mais preciso, a limitação é a placa-mãe com o próprio processador, os módulos de memória suportados por essa placa-mãe e os módulos de memória específicos que estão conectados aos slots de memória da placa-mãe. Uma forma de maximizar a memória disponível do sistema é utilizar módulos de memória semelhantes que tenham o maior tamanho possível. A segunda maneira é usar a memória Swap conforme explicado na primeira parte.

Acesso à memória

Em seguida, é considerada uma melhoria na velocidade de acesso à memória. A princípio, o limite físico é dado pelo próprio módulo de memória. Você não pode ir abaixo dos limites físicos do hardware. Em segundo lugar, um ramdisk e, em terceiro lugar, o uso de zRAM pode acelerar o acesso à memória. Discutiremos essas duas tecnologias em mais detalhes.

Criando um ramdisk

Um ramdisk é um bloco de memória que o sistema operacional manipula como um dispositivo físico para armazenar dados - um disco rígido que é totalmente mantido na memória. Este dispositivo temporário existe assim que o sistema inicia e ativa o ramdisk, e o sistema desativa o ramdisk ou é desligado. Tenha em mente que os dados que você armazena em tal ramdisk são perdidos após o desligamento da máquina.

Você pode criar um ramdisk dinâmico via sistema de arquivos tmpfs e via sistema de arquivos ramfs. Ambas as tecnologias diferem significativamente uma da outra. Primeiro, dinâmico significa que a memória para o ramdisk é alocada com base em seu uso (verdadeiro para ambos os métodos). Contanto que você não armazene dados nele, o tamanho do ramdisk é 0.

A criação de um ramdisk dinâmico via tmpfs é a seguinte:

# mkdir /media/ramdisk
# mount -t tmpfs none /media/ramdisk

A criação de um ramdisk dinâmico via ramfs é a seguinte:

# mkdir /media/ramdisk
# mount -t ramfs ramfs /media/ramdisk

Em segundo lugar, usando tmpfs e a menos que explicitamente especificado, o tamanho do ramdisk é limitado a 50% da memória física. Em contraste, um ramdisk baseado em ramfs não tem essa limitação.

A criação de um ramdisk dinâmico via tmpfs com um tamanho relativo de 20% da memória física é a seguinte:

# mkdir /media/ramdisk
# mount -t tmpfs -o size=20% none /media/ramdisk

A criação de um ramdisk dinâmico via tmpfs com um tamanho fixo de 200M de memória física é a seguinte:

# mkdir /media/ramdisk
# mount -t tmpfs -o size=200M none /media/ramdisk

Em terceiro lugar, ambos os métodos lidam com a troca de maneira diferente. Caso o sistema atinja o limite de memória de um ramdisk baseado em tmpfs, os dados do ramdisk são trocados. Isso frustra a ideia de acesso rápido. Por outro lado, o sistema operacional prioriza o conteúdo e as páginas de memória solicitadas de um ramdisk com base em ramfs, mantém isso na memória e troca as páginas de memória restantes para o disco.

Nos exemplos acima, usamos /media/ramdisk como um ponto de montagem. Em relação aos dados regulares, a única parte do sistema de arquivos Linux que é recomendada para ser usada em um ramdisk é /tmp. Este diretório armazena dados temporários, apenas, que não persistem. A criação de um ramdisk permanente que armazena o sistema de arquivos /tmp requer uma entrada adicional no arquivo /etc/fstab como segue (baseado em ramfs):

ramfs   /tmp     ramfs   defaults 0  0

Na próxima vez que você inicializar seu sistema Linux, o ramdisk será ativado automaticamente.

Usando zRAM

zRAM significa Virtual Swap Compressed in RAM e cria um dispositivo de bloco compactado diretamente na memória física. zRAM entra em ação (uso) assim que não há mais páginas de memória física disponíveis no sistema. Em seguida, o kernel do Linux tenta armazenar páginas como dados compactados no dispositivo zRAM.

Atualmente, não há nenhum pacote disponível para Debian GNU/Linux além do Ubuntu. É denominado zram-config. Instale o pacote e configure um dispositivo zRAM simplesmente iniciando o serviço systemd correspondente da seguinte forma:

# systemctrl start zram-config

Conforme fornecido pela saída de swapon -s, o dispositivo está ativo como uma partição Swap adicional. Automaticamente, um tamanho de 50% da memória é alocado para zRAM (veja a figura 1). Atualmente, não há como especificar um valor diferente para zRAM a ser alocado.

Para ver mais detalhes sobre a partição swap compactada, use o comando zramctl. A Figura 2 mostra o nome do dispositivo, o algoritmo de compactação (LZO), o tamanho da partição swap, o tamanho dos dados no disco e seu tamanho compactado, bem como o número de fluxos de compactação (valor padrão: 1).

Estratégia de uso

Em seguida, nos concentramos na estratégia de uso de memória. Existem alguns parâmetros para influenciar o comportamento do uso e distribuição de memória. Isso inclui o tamanho das páginas de memória — em sistemas de 64 bits, é de 4M. Em seguida, o parâmetro swappiness desempenha um papel. Como já foi explicado na primeira parte, este parâmetro controla o peso relativo atribuído à troca da memória de tempo de execução, em vez de descartar páginas de memória do cache de página do sistema. Além disso, não devemos esquecer o cache e o alinhamento da página de memória.

Use programas que requerem menos memória

Por último, mas não menos importante, o uso da memória depende dos próprios programas. A maioria deles está vinculada à biblioteca C padrão (libC padrão). Como desenvolvedor, para minimizar seu código binário, considere usar uma biblioteca C alternativa e muito menor. Por exemplo, existem dietlibc [1], uClibc [2] e musl lib C [3]. O site do desenvolvedor do musl lib C contém uma extensa comparação [4] sobre essas bibliotecas em termos do menor programa C estático possível, uma comparação de recursos, bem como os ambientes de construção correspondentes e arquiteturas de hardware suportadas.

Como usuário, você pode não ter que compilar seus programas. Considere procurar programas menores e estruturas diferentes que exijam menos recursos. Como exemplo, você pode usar o XFCE Desktop Environment em vez do KDE ou GNOME.

Conclusão

Existem algumas opções para alterar o uso da memória para melhor. Isso varia de Swap a compactação baseada em zRAM, bem como configurar um ramdisk ou selecionar uma estrutura diferente.

Links e referências

  • [1] dietlibc, https://www.fefe.de/dietlibc/

  • [2] uClibc, https://uclibc.org/

  • [3] musl lib C, http://www.musl-libc.org/

  • [4] comparação de bibliotecas C, http://www.etalabs.net/compare_libcs.html

Linux Memory Management Series

  • Parte 1: Gerenciamento de memória do kernel do Linux: espaço de troca

  • Parte 2: Comandos para gerenciar a memória do Linux

  • Parte 3: Otimizando o uso da memória do Linux

Agradecimentos

O autor gostaria de agradecer a Axel Beckert e Gerold Rupprecht pelo apoio durante a preparação deste artigo.

Artigos relacionados: