Uma nova série de patches apresentada por engenheiros da Oracle busca introduzir melhorias significativas na forma como o Linux gerencia memória compartilhada entre processos. Com a criação do MSHAREFS, um sistema de arquivos em memória, a proposta permite o compartilhamento de entradas de tabela de páginas (PTEs) entre processos, reduzindo drasticamente o consumo de memória em determinados cenários.
Contexto e motivação
Atualmente, cada processo que compartilha páginas de memória precisa de suas próprias entradas de tabela de páginas (PTEs). Embora cada PTE ocupe apenas 8 bytes em arquiteturas como x86_64, quando milhares de processos compartilham páginas de memória, o espaço necessário para armazenar essas tabelas pode se tornar significativo. Em um caso relatado, um servidor com 512 GB de RAM enfrentou problemas de memória ao tentar compartilhar uma área de 300 GB entre 1500 processos, devido ao consumo excessivo de memória pelas PTEs.
Exemplificando o patch sugerido ao kernel Linux
Imagine que você tem um grande mural e cada pessoa na sala precisa copiar exatamente a mesma informação desse mural para um caderno próprio. Isso é o que acontece atualmente no gerenciamento de memória: cada processo cria sua própria cópia das informações compartilhadas. O que o MSHAREFS propõe é que, em vez de cada pessoa criar uma cópia no caderno, todas compartilhem o mesmo mural diretamente. Isso economiza papel (memória) e agiliza o trabalho, especialmente quando há centenas ou milhares de pessoas (processos) tentando acessar as mesmas informações ao mesmo tempo.
Solução proposta: MSHAREFS
O patch introduz o MSHAREFS, um sistema de arquivos dedicado que permite o compartilhamento de PTEs entre processos. Os principais recursos incluem:
- Criação de regiões compartilhadas: Um arquivo criado no MSHAREFS representa uma região de memória compartilhada. Processos que mapearem essa região usarão PTEs compartilhados, reduzindo o consumo de memória.
- Estrutura de memória centralizada: Um novo
mm_struct
é associado ao arquivo no MSHAREFS, gerenciando as tabelas de páginas e as áreas de memória (VMAs) de forma centralizada. - Uso opcional e configurável: A funcionalidade é habilitada apenas para processos que explicitamente optarem por usar o MSHAREFS, garantindo compatibilidade com sistemas que não precisam dessa otimização.
Benefícios
- Economia de memória: Redução significativa no consumo de RAM para servidores que compartilham grandes áreas de memória entre muitos processos.
- Melhoria na estabilidade: Evita cenários de falta de memória causados pelo excesso de tabelas de páginas.
- Flexibilidade: Permite que aplicações escolham quando e como utilizar essa funcionalidade.
Implementação e uso
O MSHAREFS utiliza chamadas padrão do Linux, como ioctl
, para gerenciar regiões compartilhadas. O fluxo básico inclui:
- Montar o MSHAREFS:
mount -t msharefs msharefs /sys/fs/mshare
- Criar e configurar uma região compartilhada:
- Criar um arquivo no MSHAREFS.
- Configurar o endereço e tamanho da região usando
ioctl
. - Mapear memória na região compartilhada.
- Anexar processos adicionais à região:
- Abrir o arquivo correspondente no MSHAREFS.
- Recuperar informações sobre a região compartilhada.
- Mapear a região no espaço de memória do processo.
- Remover a região quando não for mais necessária.
Próximos passos
A proposta, agora em sua primeira versão formal (v1), está sendo revisada pela comunidade Linux. As discussões podem ser acompanhadas aqui, onde também estão detalhadas as implementações técnicas e os exemplos de uso.
Este trabalho representa um avanço importante para otimizar o uso de memória em servidores de alto desempenho e cargas de trabalho intensivas, como bancos de dados e sistemas com milhares de processos simultâneos.