Linux tux ninja

Uma explicação simplificada sobre a gestão de memória no Linux, com foco no swap.

Uma das coisas mais certas, quando se fala em gestão da memória RAM, é que não existe memória sobrando ou ociosa em um sistema Linux.
Cada aplicação usa uma quantidade da memória disponível no sistema.
Do que “sobra”, com exceção dos últimos megabytes, o Linux usa para fazer caching — no que se inclui o cache de página, os caches de inodes etc.
Ocupar toda a memória física disponível, é benéfico — ajuda a melhorar enormemente a eficiência geral do sistema.
Tanto a leitura quanto a escrita em disco podem se beneficiar imensamente com o uso do cache.
Em mundo ideal, você sempre terá memória suficiente para abrigar todas as suas aplicações, suprir as necessidades delas e, de lambuja, ainda terá algumas centenas de megabytes disponíveis para fazer caching.
Neste mundo utópico, desde que suas aplicações não façam demandas crescentes por mais memória e o sistema não exerça pressão crescente no cache, não há necessidade alguma para swap — a não ser permitir a hibernação.

Além de auxiliar na gestão da memória virtual do sistema, o swap tem outro papel importante: guardar o estado atual do sistema, caso você ative a hibernação do computador.
Esta função do swap não será abordada neste texto, já que não tem relação direta com o gerenciamento de memória do sistema.

Para se aprofundar mais em algum tema, clique nos links incluídos no texto deste artigo e nos que estão relacionados ao final do post.


Voltando ao caching
À medida em que as aplicações precisam de mais memória física, o sistema vai abrindo mão do espaço que estava usando para o cache em prol delas.
Desalocar cache é tão simples e fácil que é feito em tempo real.
Uma vez que todo o conteúdo do cache é sempre uma cópia de algo que já se encontra gravado em disco, portanto seu espaço, ou pode ser disponibilizado imediatamente, ou já está sempre prestes a ser liberado nos próximos segundos.
O fato é que realocar o espaço usado para caching tem zero impacto na performance das aplicações.
Tendo isto em mente, quando nos referimos a memória física “livre”, podemos estar incluindo ou não a que está sendo usada pelo cache.
linux-memória-ram-livre
Esta é a maneira como todos os sistemas operacionais modernos trabalham. Na hora de exibir a quantidade de memória livre, contudo, alguns incluem o que está ocupado pelo cache, outros não.
Concordo com alguns autores que, ao falar de “memória livre”, faz mas sentido incluir a parte ocupada pelo cache — já que é instantaneamente disponibilizada ao ser requisitada pelas aplicações.
No Linux, ao executar o comando free, ele exibe as duas situações:

free -h
              total        used        free      shared  buff/cache   available
Mem:           2,0G        207M        1,2G         55M        521M        1,7G
Swap:          6,7G          0B        6,7G

No Linux, o comando free, inclui valor do cache na coluna “disponível” (available).
Se preferir ver os valor do cache destacado em uma coluna, use as opções ‘-hwt’:

free -hwt
              total        used        free      shared     buffers       cache   available
Mem:           2,0G        491M        262M        127M        2,0M        1,2G        1,3G
Swap:          6,7G        144K        6,7G
Total:         8,7G        491M        7,0G

Como o Linux usa o swap

Este tópico será explicado de maneira básica, aqui.
Sugiro a leitura de Perguntas e respostas sobre o SWAP, caso você queira saber mais sobre o assunto.
Uma vez preenchida toda a memória física disponível na sua máquina, não há mais espaço suficiente para o cache garantir a velocidade do fluxo de dados entre as mídias físicas e a memória.
Neste caso, o Linux irá realocar espaço na memória, usado por aplicações inativas (ou pouco usadas), da memória RAM, para o swap (no disco rígido), com objetivo de ter de volta algum espaço para operar com o cache.
Isto não acontece como fruto de uma decisão simples. Não existe “um percentual” de uso da memória a partir do qual o sistema automaticamente começa a fazer swapping.
Há um algoritmo mais complexo envolvido, a partir do qual o Linux decide que é hora de levar dados da RAM para o disco.
O algoritmo leva vários fatos em conta. Este processo pode melhor ser descrito por “quanta pressão há para alocar novos bytes de memória”.
Se houver muita pressão para alocar novos blocos de memória, também haverá mais chance de que alguns outros blocos sejam “swapeados” para criar mais espaço na memória. Se houver menos pressão, as chances serão menores.
A variável que regula a pressão do cache (ou cache pressure), pode ser definida, junto com o swappiness“.
Se quiser saber como fazer isto, leia Como reduzir o uso do swap para melhorar o desempenho.
A menos que você saiba o que está fazendo, em computadores de uso genérico, não é recomendável alterar estas variáveis.
É comum vilanizarmos o swap. De modo geral, contudo, ele é uma coisa muita boa.
Você pode ser penalizado na performance do seu sistema, por uso ocasional do swap. Mas esta situação traz mais ganhos à responsividade e à estabilidade geral do sistema.
Ao reduzir o valor do swappiness, permite-se que a quantidade de memória cache diminua um pouco mais do que iria normalmente — mesmo que, de alguma forma, ela pudesse ser útil ao sistema.
O uso de valores baixos para a variável swappiness, traz o risco de tornar um computador (de uso genérico) mais lento — por que ele terá menos espaço para fazer caching.
Cabe a você determinar se, no seu caso específico, esta relação pode ser interessante e trazer ganhos de desempenho
Desabilitar completamente o swap, pode trazer riscos a estabilidade do seu sistema, principalmente se ocorrer de toda a memória física vir a ser ocupada.

O que acontece no sistema quando ele está atolado e fazendo uso pesado do swap?

Com alguma frequência, acontece de percebermos que nosso computador parece atolado de tarefas, super lento e o led indicador de atividade no disco está “quase queimando”.
Neste caso, aparentemente, o sistema está enviando uma quantidade tremenda de dados da memória RAM para o HD (ou SSD).
Culpar o swap pela situação, é uma maneira inadequada de abordar o problema.
Se o swapping realmente atingiu este extremo, o fato é que a memória física está prestes a se esgotar — e o swapping é justamente quem está evitando o travamento do sistema ou evitando que este saia “matando” processos a esmo, para conseguir se manter em pé.
Sem o swapping, numa situação como esta, processos irão colidir e morrer (crash n’ die).
Neste caso, o que se tem é um sintoma de problemas mais profundos.
Se o seu computador tivesse memória suficiente, para a execução de todas as suas tarefas, o espaço de troca (swap) serviria apenas para garantir que a memória fosse usada de forma eficiente.
Remover o swap ou restringir arbitrariamente seu uso não vai mudar o fato de que você tem um hardware com pouca memória física para executar suas aplicações.

Quase tudo do que se fala do swap e cache, aqui, vale para qualquer sistema operacional atual. Não se restringe ao Linux, portanto.

O Linux é um sistema operacional extremamente amadurecido e testado em condições das mais adversas (nos computadores mais exigidos do mundo, inclusive).
Acredite, o algoritmo que cuida da gestão da memória, escolhendo os dados menos usados para “swapear” pro disco, é muito eficiente — e a grande maioria dos usuários jamais irá precisar alterar suas variáveis e seus parâmetros de trabalho.
Em um sistema desktop, pouco usado, há uma situação bastante conhecida em que o usuário chega, após algum tempo em que a máquina estava sem uso, e tem que esperar alguns segundos (que parecem horas) até que se torne disponível novamente.
Esta demora é resultante do trabalho de mover de volta (do disco para a memória RAM) os processos que estavam ociosos.
Isto é comum quando deixamos a máquina ligada durante a noite, realizando alguma tarefa, como downloads, checagem antivírus, backup etc., enquanto dormimos.
De manhã, o sistema não tem como prever que você vai querer usar o navegador, que ficou inativo durante horas. Portanto, você terá que esperar um pouco.
Este é um dos pontos “chatos” de deixar o swap habilitado e por conta do sistema. Se você desabilitá-lo, esta lentidão, após o backup (por exemplo), não irá mais ocorrer. Em compensação, o sistema irá rodar um pouco mais lento, durante o uso diário — na medida em que haverá menos espaço para cache.
Outro fator a ser considerado, é a perda da proteção no caso de faltar memória física para suas aplicações — neste caso, o sistema vai arriar.

A maneira mais eficiente, em termos de custos, de resolver lentidão associada ao uso do swap pelo sistema, é aumentar sua memória física.
Se isto não for possível, avalie trocar suas aplicações por outras mais leves.
Desabilitar ou restringir o uso do swap é uma das soluções menos eficazes — uma vez que ele é apenas um mecanismo do sistema, usado para lidar com situações em que a memória física se tornou escassa.

Em sistemas com grande quantidade de memória RAM, o swap pode ser desabilitado com segurança?

Nos dias atuais (veja a data do post), 8 Gb de memória RAM é uma grande quantidade de memória — se estivermos falando de uma distro Linux comum, para uso genérico.
Neste cenário, raramente o usuário irá chegar ao ponto de precisar de swap.
Ainda assim, é desnecessário desativar o swap — lembre que ele tem outras utilidades.
Tampouco há necessidade de ajustar o swappiness — o sistema “sabe” que há bastante espaço na memória RAM para as aplicações e para o cache e nunca irá tomar a decisão de usar o swap.
Se, ainda assim, você quiser desabilitar o swap e reduzir o swappiness, o sistema continuará funcionando bem. Simplesmente não fará diferença.
Nos raros casos em que o sistema precisar lançar mão do swap, vai ser bom tê-lo à disposição.
Deixar os valores padrão, portanto, é a opção pela segurança e pela eficiência — tendo ou não uma grande quantidade de memória.

Como o swap atua para tornar o meu sistema mais rápido?

A transferência de dados entre a memória física e o swap (em HD ou SSD) é uma operação lenta.
Porém, é uma atitude que o kernel só toma quando tem certeza de que os benefícios superam seus custos.
Um exemplo disto é quando a aplicação ativa no seu sistema cresceu no uso da memória a ponto de não deixar mais espaço livre para o cache — ocasionando uma perda sensível na eficiência da transferência de dados.
Neste caso, há benefícios em mover porções inativas ou pouco usadas da memória para o swap, liberando alguma quantidade de memória suficiente para agilizar o fluxo de dados do cache.
Algumas aplicações podem também precisar de uma grande quantidade de dados na hora de iniciar. A pressão por recursos é aliviada logo após seu completo carregamento.
Se o seu sistema já estiver sobrecarregado, de antemão, o swap pode evitar um crash, durante este processo.

Conclusão

Não faça deste caso, um dilema Tostines.
Não é o swap que torna o seu sistema mais lento. É o contrário.
É por estar muito lento, que seu sistema faz uso deste recurso.

As pessoas associam a lentidão do sistema ao uso do swap, por que seu uso acontece quando o sistema está perto da inanição por recursos de memória.
O swap, antes de estar atrapalhando a sua vida, pode estar salvando o seu dia de trabalho.
Se ele está “salvando demais” o seu dia, em vez de fazer dele um vilão suas ações precisam ter como alvo o problema certo — a falta de recursos para rodar as aplicações atuais. Ou muda as aplicações, ou aumenta os recursos.

Referências

Como verificar a memória swap no Linux.
Como criar um arquivo swap no Ubuntu.
Perguntas e respostas sobre o swap.
http://askubuntu.com/questions/184217/why-most-people-recommend-to-reduce-swappiness-to-10-20

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

2 thoughts on “Uma explicação simplificada sobre a gestão de memória no Linux, com foco no swap.”

  1. Olá Elias,
    eu tenho 8GB de RAM e criei um SWAP de 4GB. Acho que foi muito né?
    É possível reduzir estes 4GB de SWAP para algo como 1 ou 2GB?

    1. Uma das maneiras seguras de alterar o SWAP é usando um CD/DVD/Pendrive com o Ubuntu Live instalado.
      A partir dele, rode o aplicativo gparted e faça o redimensionamento da partição.
      É seguro, mas você tem que ser cuidadoso.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *