Gerenciamento de Swap - Evitando Esgotamento de Memória no Linux
O que é Swap?
Swap é uma área de memória virtual em disco que o Linux usa quando a RAM física está cheia. Ele funciona como uma rede de segurança -- quando a RAM acaba, os processos podem continuar executando em vez de serem imediatamente encerrados. No entanto, como o swap envolve I/O de disco, ele é ordens de magnitude mais lento que a RAM.
Existem duas formas de swap:
| Forma | Descrição |
|---|---|
| Partição swap | Partição de disco dedicada. Ligeiramente mais rápida, mas difícil de redimensionar |
| Swapfile | Arquivo regular no sistema de arquivos. Fácil de redimensionar, agora a abordagem padrão |
Swap não resolve escassez de memória -- apenas a adia. Swapping sustentado (thrashing) é um problema de desempenho e um sinal de um problema subjacente de memória. Adicionar mais swap ganha tempo, mas não é uma correção.
Como Verificar o Uso de Swap
free -h é a maneira mais rápida de verificar o swap. Observe a linha Swap: -- se used cresce ao longo do tempo, o sistema está fazendo swap.
free -h
total used free shared buff/cache available Mem: 3.8Gi 2.1Gi 408Mi 45Mi 1.3Gi 1.4Gi Swap: 2.0Gi 512Mi 1.5Gi
Para listar dispositivos swap com detalhes, use swapon --show:
swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 2G 512M -2
Para observar a atividade de swap ao longo do tempo, use vmstat. Observe as colunas si (swap in) e so (swap out):
vmstat 1 5
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 524288 418032 98304 1350656 0 0 2 5 45 80 2 1 97 0 0 0 1 524288 200000 98304 1350672 8 12 0 20 65 120 2 1 90 7 0
Valores si/so não-zero sustentados indicam thrashing.
Como Criar um Swapfile
O procedimento padrão em sistemas Ubuntu / Debian para adicionar capacidade de swap:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
Se fallocate não estiver disponível (NFS ou alguns sistemas de arquivos), use dd em vez disso:
dd if=/dev/zero of=/swapfile bs=1M count=2048
Verifique com swapon --show:
swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2
Tornar o Swap Persistente Entre Reinicializações
Adicione uma entrada em /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Após editar /etc/fstab, valide com sudo swapon -a antes de reiniciar. Um erro de sintaxe no fstab pode impedir o sistema de inicializar.
Remover um Swapfile
sudo swapoff /swapfile sudo rm /swapfile
Também remova a linha correspondente do /etc/fstab.
Como Ajustar o Swappiness
swappiness é um parâmetro do kernel (0-100) que controla quão agressivamente o kernel usa swap. O padrão é 60.
| Valor | Comportamento |
|---|---|
| 0 | Swap apenas quando a RAM está quase esgotada (não desabilita swap completamente) |
| 10-30 | Cargas de trabalho desktop/estação -- preferir RAM |
| 60 | Padrão |
| 100 | Swap agressivamente |
Verificar o valor atual:
cat /proc/sys/vm/swappiness
Alterar temporariamente (reseta ao reiniciar):
sudo sysctl vm.swappiness=10
Persistir a configuração:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
Para servidores de banco de dados (MySQL, PostgreSQL), reduzir swappiness para 1-10 é um passo comum de ajuste em produção. Swap sob cargas de banco de dados causa picos de latência de consultas que são difíceis de diagnosticar sem esse contexto.
O que Acontece Quando a Memória se Esgota?
Quando tanto RAM quanto swap estão cheios, o OOM killer (Out-Of-Memory killer) do kernel encerra um processo para liberar memória. Isso causa falhas inesperadas na aplicação. Verifique OOM kills no log do kernel:
dmesg | grep -i 'oom\|killed process\|out of memory'
[123456.789] Out of memory: Killed process 1234 (mysqld) total-vm:2097152kB, anon-rss:1048576kB
Ou via journal do systemd:
journalctl -k | grep -i 'oom\|killed'
Adicionar swap não é remédio para OOM kills -- apenas os adia. Se OOM kills recorrerem, use top ou htop para identificar qual processo está consumindo memória e investigue a causa raiz (vazamento de memória, configuração incorreta, instância subdimensionada).
Proteger um Processo Específico de OOM Kill (Temporário)
Ajuste o score OOM para um processo crítico. Os valores variam de -1000 (nunca encerrar) a 1000 (encerrar primeiro):
echo -1000 | sudo tee /proc/$(pgrep mysqld)/oom_score_adj
Essa configuração não persiste entre reinicializações. Use-a apenas como solução temporária enquanto aborda o problema subjacente de memória.