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:
# mount -t tmpfs none /media/ramdisk
A criação de um ramdisk dinâmico via ramfs é a seguinte:
# 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:
# 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:
# 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):
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:
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.