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.