Gerenciamento de Swap - Evitando Esgotamento de Memória no Linux

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'

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.

Próximas Leituras