Adicionando Swap ao CentOS, Ubuntu e derivados

Para você que acabou de criar a sua primeira VM no Digital Ocean e pegou logo de cara a de 512 de RAM, você vai se ver no aperto dependendo da aplicação que colocar para executar nela. Para solucionar possíveis problemas de falta de memória vamos adicionar Swap a esta máquina tão simplória.

Aplicações simples como o MySQL e o Jenkins rodando nessas máquinas poder gerar alguma dor de cabeça caso você não identifique que o problema é falta de memória. Por exemplo, no meu caso o Jenkins parava a execução dos testes no meio, pois recebia um SIGKILL de alguém, provavelmente do S.O. O mais estranho é que o Jenkins continuava executando, apenas parava o Job que estava em execução. A solução foi bem simples, adicionar uma Swap, já que não queríamos aumentar os valores com VMs do DO.

O tutorial de hoje é baseado no CentOS e no Ubuntu. Fiz a mesma configuração em duas VMs distintas. A maioria das distros suportam os comandos e sistemas de arquivos aqui mencionados.

Verificando a existência de Swap

Vamos verificar se existe Swap habilitado primeiro, para isso execute o comando:

swapon -s

Não deverá retornar nada caso não tenha Swap.

O mesmo pode ser observado com o comando:

free -m

Que neste caso irá retornar 0, conforme abaixo:

             total       used       free     shared    buffers     cached
Mem:           490        399         91          8         24        263
-/+ buffers/cache:        111        378
Swap:            0          0          0

Antes de começar vamos verificar se existe algum espaço em disco que podemos usar, para isto execute o comando:

df -h

O retorno deverá ser algo semelhante ao abaixo:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  1,5G   18G   9% /
devtmpfs        240M     0  240M   0% /dev
tmpfs           246M     0  246M   0% /dev/shm
tmpfs           246M  8,3M  237M   4% /run
tmpfs           246M     0  246M   0% /sys/fs/cgroup

Agora que verificamos quanto temos de espaço em disco vamos a criação do arquivo de Swap.

Como definir um bom tamanho para o Swap?

O recomendado em qualquer distribuição é o dobro de memória RAM para máquinas com até 8 GB de RAM. Caso sua máquina tenha mais que isso não há necessidade se sua Swap ser maior que 16 GB. Vale lembrar que Swap é algo que não queremos que se use em grande quantide, pois isto afeta o desempenho da máquina. Se você notar que o sistema está usando quase toda a Swap isto quer dizer que é necessário um upgrade de RAM.

Criando o arquivo de Swap

O modo mais rápido para criar um arquivo swap é com o comando fallocate. O fallocate é usado para pré-alocar espaço para um arquivoe para ser rápido ele preenche o arquivo com zeros. O fallocate suporta os sistemas de arquivos btrfs, ext4, ocfs2 e xfs.

Eu vou criar o arquivo com 1 GB no raiz (/) com o nome swapfile. Para isto vou usar o comando abaixo:

sudo fallocate -l 1G /swapfile

Para testar se o arquivo foi criado corretamente com o comando:

ls -lh /swapfile

E o resultado deverá ser semelhante ao abaixo:

-rw-r--r-- 1 root root 1,0G Mai 28 20:09 /swapfile

Habilitando o Swap

Antes de habilitar o Swap, vamos mudar as permissões do arquivo, para que ninguém além do root tenha acesso à ele. Para isto executamos o comando:

sudo chmod 600 /swapfile

Você pode verificar as permissões com o comando:

ls -lh /swapfile

-rw------- 1 root root 1,0G Mai 28 20:09 /swapfile

Agora que tiramos as permissões para os demais usuários, podemos montar o Swap. Para isto execute o comando:

sudo mkswap /swapfile

O resultado, se tudo ocorrer bem, é exibir o tamanho alocado e o UUID que foi montado.

Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=30572f65-706b-43c2-8a87-35cf8b308e82

Após montado podemos habilitar o Swap, para isto execute o comando abaixo:

sudo swapon /swapfile

Você pode usar os comandos swapon/swapoff para habilitar/desabilitar a memória Swap.

Agora podemos usar os comandos swapon -s e free -m para verificar se o Swap está habilitado.

Swap permanente

Para que o Swap seja permanente, ou seja, não se perca no reboot, devemos alterar o fstab. Abra o arquivo /etc/fstab com o seu editor preferido, no meu caso vou usar o VIM:

sudo vim /etc/fstab

E vamos adicionar a seguinte linha no fim do arquivo:

/swapfile   none    swap    sw    0   0

Turbinando o Swap

Swappiness

O parâmetro swappiness define com que frequência o sistema manda dados ao Swap, e seu valor vai de 0 a 100. Quanto mais próximo a 100, mais Swap irá usar, garantindo mais mémoria livre. Como Swap é mais lento, vamos fazer com que use a memória o máximo do tempo ao invéz de Swap.

Para verificar o valor atual execute o comando:

cat /proc/sys/vm/swappiness

Vamos alterar o valor para 10 com o comando:

sudo sysctl vm.swappiness=10

Para que esta configuração seja permanente devemos editar o arquivo /etc/sysctl.conf:

sudo vim /etc/sysctl.conf

E adicionar no fim do arquivo a linha:

vm.swappiness=10

Cache Pressure

Para verificar o valor atual execute o comando:

cat /proc/sys/vm/vfs_cache_pressure

Vamos alterar o valor para 50 com o comando:

sudo sysctl vm.vfs_cache_pressure=50

Para que esta configuração seja permanente devemos editar o arquivo /etc/sysctl.conf:

sudo vim /etc/sysctl.conf

E adicionar no fim do arquivo a linha:

vm.vfs_cache_pressure=50

Essas configurações são simples, mas podem solucionar alguns problemas do dia a dia.

Este artigo foi baseado no tutorial How To Add Swap on CentOS 7.

  • Romualdo Costa

    Toda hora o droplet dava problema, então descobri que não vem com swap. kkk. Foi isso mesmo aí que fiz na época.

    • Alexandre Vicenzi

      Bem nessa, é impossível rodar algo nas máquinas de 512 sem ter swap.

  • Romualdo Costa

    Toda hora o droplet dava problema, então descobri que não vem com swap. kkk. Foi isso mesmo aí que fiz na época.

    • Alexandre Vicenzi

      Bem nessa, é impossível rodar algo nas máquinas de 512 sem ter swap.

  • Romualdo Costa

    Toda hora o droplet dava problema, então descobri que não vem com swap. kkk. Foi isso mesmo aí que fiz na época.

    • Alexandre Vicenzi

      Bem nessa, é impossível rodar algo nas máquinas de 512 sem ter swap.