Melhores Práticas para Ajustar o Swappiness e o Comportamento do Cache de Memória no Linux
Os sistemas Linux gerenciam a memória dinamicamente, utilizando a RAM disponível para aplicações, caches do sistema de arquivos e operações do kernel. Embora essa flexibilidade seja uma força, parâmetros de memória mal configurados podem levar a gargalos de desempenho, particularmente E/S de disco excessiva devido a swapping desnecessário ou cache ineficiente.
Este guia explora dois parâmetros críticos do kernel que governam como o Linux lida com a pressão da memória: vm.swappiness e vfs_cache_pressure. Compreender e ajustar essas configurações é essencial para administradores de sistema que buscam maximizar a capacidade de resposta de aplicações, minimizar a latência causada pelo acesso ao disco e garantir um desempenho de servidor estável.
Entendendo os Parâmetros de Gerenciamento de Memória do Linux
O Linux usa heurísticas para decidir quais páginas de memória realocar quando o sistema precisa de mais RAM livre. As duas principais áreas controladas pelos parâmetros do kernel são o swapping (movendo páginas de memória inativas para o disco) e o caching (mantendo metadados e dados do sistema de arquivos na RAM).
1. vm.swappiness
vm.swappiness dita a tendência do kernel de mover processos da memória física para o espaço de swap no disco. É um valor entre 0 e 100.
- Valor Alto (por exemplo, 60, o padrão em muitas distribuições): O kernel agressivamente faz swapping de páginas inativas, mesmo que haja bastante memória livre disponível. Isso prioriza manter o cache de página grande, mas pode levar a swaps frequentes e indutores de latência se as aplicações precisarem subitamente dessa memória.
- Valor Baixo (por exemplo, 10 ou menos): O kernel prefere recuperar memória do cache de página antes de começar a fazer swapping de processos. Isso mantém as aplicações em execução na RAM por mais tempo, melhorando a capacidade de resposta, mas potencialmente reduzindo o desempenho de E/S do disco se o sistema precisar constantemente descartar páginas de cache.
- Valor 0: Em kernels modernos (pós-2.6.32), definir
swappinesscomo 0 tenta evitar o swapping inteiramente até que seja absolutamente necessário (ou seja, condições de falta de memória), fazendo com que o sistema dependa primeiro da recuperação de memória do cache de página.
Aplicação Prática de vm.swappiness
A configuração ideal depende muito da carga de trabalho:
| Tipo de Carga de Trabalho | Intervalo de swappiness Recomendado |
Justificativa |
|---|---|---|
| Servidores de Banco de Dados, Computação de Alto Desempenho (HPC) | 1 - 10 | Manter os conjuntos de trabalho ativos do banco de dados residentes na memória física para evitar latência de disco. |
| Servidores de Propósito Geral, Desktops | 30 - 60 (Padrão) | Equilibra a capacidade de resposta com as necessidades de cache de disco. |
| Servidores que dependem muito de grandes caches de arquivos (por exemplo, servidores web com alto tráfego de disco) | 60 - 80 | Prioriza manter o cache de disco grande para servir rapidamente as solicitações subsequentes da RAM. |
Como Verificar o Valor Atual:
cat /proc/sys/vm/swappiness
Como Alterar o Valor Temporariamente (até a reinicialização):
Para definir o swappiness para 10:
sudo sysctl vm.swappiness=10
Como Alterar o Valor Permanentemente:
Edite o arquivo /etc/sysctl.conf e adicione ou modifique a linha:
# /etc/sysctl.conf
vm.swappiness = 10
Após salvar, aplique as alterações sem reiniciar usando:
sudo sysctl -p
Dica de Melhor Prática: Para servidores modernos que hospedam aplicações intensivas em memória, como bancos de dados, definir
vm.swappinessentre 1 e 10 é geralmente o melhor ponto de partida para evitar a degradação do desempenho devido ao swapping.
2. vfs_cache_pressure
vfs_cache_pressure controla a agressividade com que o kernel recupera a memória usada para metadados de diretório e inode (o cache VFS).
- Este valor varia de 0 a 1000.
- O valor padrão é tipicamente 100.
Com um valor de 100, o kernel equilibra a recuperação da memória do cache VFS com a recuperação da memória usada pelo cache de página (dados do disco). Um valor de 100 significa que, quando há pressão de memória, o kernel tenta recuperar 1 parte da memória do cache de inode/dentry para cada 1 parte da memória do cache de página.
Ajustando vfs_cache_pressure
- Aumentar o Valor (por exemplo, > 100): Torna o kernel mais agressivo na recuperação da memória do cache VFS. Isso libera a RAM mais rapidamente, mas pode levar a pesquisas mais lentas subsequentes no sistema de arquivos, pois os metadados precisam ser lidos do disco novamente.
- Diminuir o Valor (por exemplo, < 100): Torna o kernel mais conservador na recuperação do cache VFS. Isso mantém as informações de diretório e inode na memória por mais tempo, acelerando operações repetidas do sistema de arquivos.
Quando Diminuir vfs_cache_pressure:
Se o seu sistema acessa frequentemente as mesmas grandes estruturas de diretórios (comum em aplicações complexas, orquestração de contêineres ou configurações de rede específicas), definir este valor mais baixo (por exemplo, 50) pode melhorar o desempenho mantendo os metadados prontamente disponíveis na RAM.
Quando Aumentar vfs_cache_pressure:
Se o seu sistema está sofrendo de pressão geral de memória e você quer que o kernel recupere qualquer memória não utilizada rapidamente, você pode aumentar este valor, embora isso seja menos comum do que diminuí-lo.
Como Verificar o Valor Atual:
cat /proc/sys/vm/vfs_cache_pressure
Como Alterar o Valor Permanentemente:
Edite /etc/sysctl.conf:
# /etc/sysctl.conf
vfs_cache_pressure = 50
Aplique as alterações com sudo sysctl -p.
Aviso: Definir
vfs_cache_pressurecomo 0 efetivamente desabilita o kernel de recuperar a memória do cache VFS, similar a definirvm.swappiness=0para swapping. Isso só deve ser feito em sistemas com RAM abundante que precisam de desempenho máximo absoluto do sistema de arquivos.
Cenários de Ajuste Abrangentes
Escolher a combinação certa desses parâmetros otimiza o equilíbrio entre a estabilidade da aplicação e o cache do sistema de arquivos.
Cenário 1: Servidor de Banco de Dados (Prioridade de Memória)
Objetivo: Maximizar a residência da memória da aplicação; minimizar o swapping a todo custo.
vm.swappiness = 5vfs_cache_pressure = 50(Manter os dados de diretório em cache de alguma forma, mas priorizar a memória da aplicação em detrimento dos metadados VFS se a RAM ficar apertada).
Cenário 2: Servidor com Alta E/S de Disco (Prioridade de Cache)
Objetivo: Maximizar o desempenho do disco mantendo os dados de arquivo frequentemente acessados no cache de página.
-
vm.swappiness = 80(Permite que o swapping ocorra mais cedo para liberar RAM para a expansão do cache de disco). -
vfs_cache_pressure = 100(Equilíbrio padrão entre inode e cache de página).
Cenário 3: Host de Virtualização ou Sistema de Propósito Geral
Objetivo: Desempenho estável em múltiplas cargas de trabalho.
vm.swappiness = 30(Uma configuração moderada que favorece manter VMs/processos ativos na RAM um pouco mais do que o padrão 60, mas ainda permite o swapping controlado).vfs_cache_pressure = 100(O padrão é frequentemente suficiente).
Monitoramento e Validação
Após aplicar as alterações, o monitoramento contínuo é crucial para validar o impacto. Use ferramentas como free, vmstat e painéis de monitoramento de desempenho do sistema.
Usando vmstat:
Monitore as colunas si (swap in) e so (swap out). Um sistema saudável com baixo swappiness deve mostrar valores baixos ou zero para si e so sob carga normal.
vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\ r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 123456 102400 5123456 0 0 0 5 40 70 1 1 98 0 0
Se os valores de so permanecerem altos após reduzir o swappiness, isso indica que a RAM física é genuinamente insuficiente para a carga de trabalho, e aumentar a RAM é a única solução permanente.
Conclusão
Ajustar vm.swappiness e vfs_cache_pressure são técnicas fundamentais na otimização de desempenho do Linux. Ao reduzir conservadoramente o swappiness (por exemplo, para 10) para aplicações sensíveis à memória, você garante que processos cruciais permaneçam residentes na RAM física. Simultaneamente, o ajuste fino de vfs_cache_pressure permite que os administradores ditem a preferência do kernel entre armazenar metadados do sistema de arquivos versus dados da aplicação na memória. Sempre teste as alterações sob condições de carga realistas para confirmar o aumento de desempenho desejado.