No Linux, o swap é a memória virtual (também é conhecido como área de troca). A memória virtual funciona como uma extensão da memória RAM, que fica armazenada no disco. O porquê da memória swap precisar existir é simples: o sistema operacional precisa de memória para funcionar, e se a memória acabar, o sistema falha. O swap fica como uma reserva emergencial caso a memória RAM acabe. A memória swap era bastante útil em tempos passados onde memória RAM era algo mais escasso. Hoje em dia, tanto a RAM quanto espaço em disco estão baratos. É sempre recomendado utilizar swap, mesmo com muita memória RAM.
O swap pode ficar tanto em uma partição, quanto em um arquivo no disco. No caso de ficar numa partição em um disco comum (não-SSD), recomenda-se colocar a partição no início do disco, assim a leitura durante a rotação do disco magnético é mais rápida. No caso de partições em disco SSD, tanto faz pois não há rotações como um disco comum. Algumas distribuições, como Debian e Ubuntu, tem no instalador uma opção para colocar a partição no início do disco.
Importante: lembre-se que o swap é bem mais lento que a memória RAM. Se você colocar swap demais num sistema e começar a usá-lo muito você vai ganhar uma grande de uma lentidão! (muita lentidão em discos convencionais e mesmo assim lentidão em discos SSD)
Que tamanho usar?
Desde os primórdios dos tempos, e você ainda vai encontrar muito essa informação, recomendava-se colocar sempre o dobro da RAM como swap. Por exemplo: se uma máquina tem 1GB de RAM, coloca-se 2GB de swap. Mas esse tipo de conselho era mais comum quando as máquinas tinham pouco de RAM. Se um servidor tem 16GB, geralmente não é necessário você colocar 32GB de swap.
Essa regra do dobro foi alterada mais recentemente. Se a máquina tem até 2GB de RAM, coloque o dobro. A partir daí, cada GB adicional de RAM é apenas RAM+2GB na swap. Ou seja:
- Um sistema de 2GB de RAM teria 4GB de swap (2×2).
- Um sistema de 3GB de RAM teria 5GB de swap (3+2).
- Um sistema de 8GB de RAM teria 10GB de swap (8+2).
- Um sistema de 16GB de RAM teria 18GB de swap (16+2).
Essa sugestão de tamanho de swap não é regra e não precisa ser seguida à risca. Eu particularmente costumo dizer e recomendar como base 4 a 6GB de swap em qualquer tipo de máquina ou servidor. Eu costumo dizer que se você está usando swap demais (mais que 6GB!) é porque isso é um problema e deve ser resolvido colocando mais memória RAM ou escalando horizontalmente os serviços que gastam muita memória. Lembre-se: swap deve ser usado sempre como reserva. Determine o quanto de swap você precisa de acordo com a carga do seu sistema.
Como identificar o swap (e quanto estamos usando)
Há diversas maneiras de você identificar o swap de um sistema.
- Vendo através do sistema de arquivos proc:
$ cat /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 2048276 112 -1
Que significa um swap do tipo partição, no /dev/sda2, com tamanho de 2GB (usando apenas 112KB).
- Com o comando swapon -s (que é o mesmo que ver o arquivo do proc):
$ swapon -s Filename Type Size Used Priority /var/swapfile.img file 2097144 5256 -1
Que significa um swap do tipo arquivo, no /var/swapfile.img, com tamanho de 2GB (usando 5MB).
- Com o comando free:
$ free total used free shared buffers cached Mem: 5986512 3210580 2775932 0 80016 1043436 -/+ buffers/cache: 2087128 3899384 Swap: 5996540 0 5996540 $ free -m total used free shared buffers cached Mem: 5846 3113 2732 0 78 997 -/+ buffers/cache: 2038 3808 Swap: 5855 0 5855
Na última linha do comando, temos uns 6GB alocados e nada usado.
- Com o comando vmstat:
$ 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 1 1 8392 20800 268 15568 0 2 136 309 50 137 2 2 95 1 1 1 8492 118864 268 14680 0 100 768 100 374 300 42 58 0 0 1 1 8616 27064 164 13628 0 124 640 124 344 311 44 56 0 0 1 0 9020 79260 164 12396 0 404 768 404 363 332 49 51 0 0 1 1 9464 89268 164 11328 0 444 640 444 387 320 41 59 0 0
A coluna swpd mostra quanto de swap foi alocado (foi até 9.5MB).
A coluna so mostra quanto de espaço foi alocado no swap (até 444KB).
A coluna si mostra o quanto foi liberado do swap (no exemplo, nada foi liberado: 0KB).
Usando o swap em um arquivo
Às vezes é necessário expandir o swap sem ter que mexer nas partições ou para uso temporário. Para estes casos, podemos criar um arquivo comum no sistema de arquivos e torná-lo swap. É um pouco pior que direto na partição pois tem um pequeno overhead do sistema de arquivos, mas funciona muito bem.
Primeiro crie um arquivo preenchido com zeros do tamanho que você quer com o dd:
dd if=/dev/zero of=/swapfile.img bs=1M count=2000
Esse comando irá criar o arquivo /swapfile.img com 2GB (1M x 2000).
Agora crie a área de swap no arquivo:
mkswap /swapfile.img
O mkswap é quem define que um arquivo ou partição é uma área de swap. E sim, você pode usar o mkswap para criar o swap em uma partição também. Pode também usar o swapon, o swapoff, e por aí vai…
Depois é só ativar com o comando swapon:
swapon /swapfile.img
Veja se ativou:
$ swapon -s Filename Type Size Used Priority /swapfile.img file 2097144 5256 -1
Se quiser que o swap seja ativado toda vez na inicialização, insira a linha no /etc/fstab:
/swapfile.img swap swap defaults 0 0
E finalmente, se você quiser desativar o swap do seu sistema (útil para forçar desalocar tudo do swap):
swapoff /swapfile.img
Ativando ou desativando todos os swaps
É possível carregar múltiplos arquivos e/ou partições como swap.
Você pode ativar com swapon:
swapon <dispositivo ou arquivo>
E desativar com o swapoff:
swapoff <dispositivo ou arquivo>
Você pode configurar o /etc/fstab com as definições de swap com uma linha como esta:
<dispositivo ou arquivo> swap swap defaults 0 0
E com essas linhas configuradas, pode usar o parâmetro -a no swapon ou swapoff:
# ativa todos os swaps configurados no fstab swapon -a # desativa todos os swaps do sistema swapoff -a
Usando o swappiness – ou como fazer com que o kernel use menos o swap
O swappiness é um parâmetro de kernel que configura o quão frequente deve-se usar a memória swap. Em instalações padrões, o swappiness é geralmente é 60 ou 80, o que indica 60% ou 80% de probabilidade do kernel usar o swap. Esse valor vai de 0 (nunca usar swap, ao menos que o sistema vá falhar) e 100 (usar swap agressivamente, toda vez que puder).
Em outras palavras, se você quer evitar que os programas e serviços usem swap demais, pode diminuir o valor do swappiness. Mas é bom manter o swap ativado para caso ocorra alguma falha desgraçada.
Para configurar o swappiness, basta editar um arquivo no proc.
Por exemplo, configurar o swappiness para 20:
echo 20 > /proc/sys/vm/swappiness
Ou até mesmo para 0:
echo 0 > /proc/sys/vm/swappiness
E se você quiser que isso persiste depois de reiniciar a máquina, coloque a seguinte linha no /etc/sysctl.conf:
vm.swappiness=20
(O comando sysctl -p também pode carregar as configurações deste arquivo para kernel imediatamente).
Referências
- Wikipedia: Memória Virtual
- RHEL Deployment Guide: Swap Space
- nixCraft HowTo: Check Swap Usage in Linux
- VivaoLinux: Área de Troca (Swap)