Atualmente não é muito habitual usarmos de memória virtual em disco (a tradicional partição ou arquivo swap) no Linux, mas em alguns casos ter um arquivo deste ativo e pronto para uso pode ser a diferença entre sua aplicação concluir a tarefa – ainda que mais lento – ou ela quebrar e você perder seu tempo, sendo necessário recomeçar o trabalho novamente. Vejamos então como ativar um arquivo swap no Linux.
Por que criar um arquivo swap?
Swap é como chamamos a partição (ou arquivo) criado no nosso sistema para “complementar” a memória RAM dos nossos computadores.
Algumas décadas atrás era padrão que a instalação de qualquer distribuição Linux já criasse uma partição formatada como swap, mas esse tempo se foi e atualmente não é raro vermos máquinas criadas sem este recurso.
Há alguns anos eu já não crio partição swap nas minhas máquinas também e como memória se tornaram relativamente mais abundantes em nossos sistemas isso se tornou quase dispensável.
Depois que comecei a trabalhar com Cloud notei que instâncias Linux em geral em alguns provedores também já são iniciadas apenas com a memória “real” e em uso de swap.
Mas vez por outra eu preciso executar uma rotina que requer mais memória do que possuo e se não disponho de tempo, $$$, ou mesmo o trabalho a ser feito não justifica os gastos para instanciar uma nova máquina com mais recursos o jeito é apelar para o swap.
A solução ideal, claro, é aumentar a memória RAM visto que o arquivo ou partição swap estão em um HD ou SSD da sua máquina e indubitavelmente estes dispositivos possuem uma performance muito inferior a memória RAM (mesmo que seja um NVMe de última geração), no entanto, em certas situações é melhor rodar uma aplicação mais lenta do que não rodar, ou tê-la quebrado no meio do processamento porque a memória esgotou.
Esta mensagem acima é um exemplo de mensagem registrada nos logs do meu sistema quando uma aplicação foi derrubada por falta de memória. Você não vai querer vê-la quando estiver rodando uma aplicação por várias horas e ansiosamente aguardando o resultado final.[1727890.492109] Out of memory: Killed process 602389 (imageprocess) total-vm:18789000kB, anon-rss:7614440kB, file-rss:0kB, shmem-rss:52996kB, UID:1000 pgtables:25700kB oom_score_adj:0
É neste momento que o uso do SWAP brilha como uma alternativa rápida de se implantar, sem necessidade de parada do ambiente, grátis e evitando ou pelo menos minimizando as chances da aplicação ser encerrada, o, que em alguns casos, poderá levá-lo inclusive a corrupção de dados.
Criando e ativando o arquivo swap
Para criar e ativar um arquivo de swap, nós precisamos de privilégios administrativos, então nos exemplo a seguir todos os comandos deverão ser precedidos pelo “sudo” ou executados a partir de uma sessão com usuário “root”.
Passo 1: Criar o arquivo de swap – Usamos aqui o comando “dd” para criar um arquivo “/SWAPFILE” com 16 mil blocos de 1MiB ou, em bom “matematiquez”, 16GiB. A permissão 0600 é extremamente restritiva para evitar acidentes, ela permitirá que apenas o root possa acessar este arquivo e sem isso você poderá ter problemas:
sudo dd if=/dev/zero of=/SWAPFILE bs=1M count=16k
sudo chmod 0600 /SWAPFILE
Obs: Se você tem um sistema de arquivos formatado como BTRFS, antes de prosseguir, leia as considerações sobre este sistema mais adiante
Passo 2: Transformar o arquivo vazio em um arquivo swap – Apenas informar o nome do arquivo é suficiente para que o comando mkswap saiba o que deve fazer:
sudo mkswap /SWAPFILE
Passo 3a: Ativa o swap temporariamente – Com o swap criado podemos ativa-lo manualmente e ele permanecerá ativo até o próximo reboot da máquina:
sudo swapon /SWAPFILE
Passo 3b: Ativar o swap permanentemente – Se você precisar que o swap esteja pronto após o boot da máquina, você deve registrá-lo no arquivo de filesystems do seu sistema (o arquivo /etc/fstab) e depois ativando todos os swapfiles disponíveis com o “swapon -a”
echo "/SWAPFILE none swap sw 0 0" | sudo tee -a /etc/fstab
sudo swapon -va
Com o swap ativo, sempre que necessário o seu sistema operacional moverá blocos de dados da memória RAM para o swap a fim de liberar recursos e assim manter sua aplicação rodando (ainda que mais lenta).
Você pode acompanhar isso usando ferramentas de monitoramento como top, htop, bpytop, free etc.
Algumas vezes, mesmo que pareça desnecessário, você verá o swap em uso. Isso é normal pois o kernel está sempre movimentado dados de um lado para outro na memória.
Desativando o swap
Caso você tenha muita RAM disponível e queira desativar o swap, use o comando swapoff para que o sistema esvazie o arquivo e então o desative.
sudo swapoff /SWAPFILE
Ao fazê-lo o arquivo não será mais considerado como memória, porém estará pronto para ser usado novamente caso você precise.
Criando swapfiles em sistema de arquivos Btrfs
O sistema de arquivos BTRFS já existe há alguns anos e tem sido adotado por diversas distribuições Linux como substituto para o bom e velho Ext4.
Este novo sistema traz inúmeras vantagens e benefícios, mas possui algumas limitações, como por exemplo em versões anteriores a 5.x do Kernel Linux, não era possível criar swapfiles sobre volumes BTRFS.
Mas agora se você já usa uma distribuição Linux com Kernel 5.x ou superior, desde que atenda alguns requisitos, já é possível criar um swapfile funcional e com segurança.
O procedimento para isso envolve alguns passos além do simples “dd”, então troque o “passo 1”, das instruções acima, por este aqui.
Passo 1(btrfs): Criar arquivo swap em sistema de arquivos BTRFS – Será criado um arquivo com tamanho 0 para que seja possível definir no modo “NoCOW” (desativar o Copy-on-Write) apenas neste arquivo; em seguida o arquivo é expandido para 16GB (o tamanho que queremos o nosso swapfile) e por fim definimos a permissão restritiva evitando incidentes com este arquivo:
sudo truncate -s 0 /SWAPFILE
sudo chattr +C /SWAPFILE
sudo fallocate -l 16G /SWAPFILE
sudo chmod 0600 /SWAPFILE
Há algumas outras considerações a serem atendidas além do Kernel Linux superior ao 5, mas para a maioria dos sistemas isso basta, de qualquer forma, não deixe de ler a página 5 do manual do Btrfs (man 5 btrfs) onde há uma seção exclusiva para tratar do suporte a swapfiles.
Algumas considerações finais
Além das informações sobre BTRFS, vale reforçar o que já disse antes sobre a performance do swap (qualquer que seja o lugar onde ele esteja).
Por melhor que seja o seu dispositivo de armazenamento, ele não será melhor do que um conjunto de módulos RAM maiores e de qualidade mediana, no entanto em razão do tempo e custo para obter estes dispositivos, se for preferível ter a aplicação rodando mais lenta do que não tê-la rodando, vá em frente e crie o arquivo.
Outro ponto a ser considerado é que você não precisa criar o swap no primeiro disco da máquina, você pode criá-lo em [quase] qualquer lugar, então, verifique qual é o dispositivo mais rápido da sua máquina dê preferência a ele.
Atente também para o “quase” usado no parágrafo anterior. Há algumas limitações a serem consideradas. Por exemplo se você usar uma aplicação antiga de suspensão (aquele modo ACPI para deixar a máquina dormente); o SWAP também não pode ser usado em volumes NFS e similares; nem em sistemas que interfiram no acesso direto ao disco, com o recurso copy-on-write (COW) ou que crie arquivos com “buracos” ou Pré-alocados; você pode encontrar mais detalhes sobre isso na página 8 do manual do comando swapon (man 8 swapon).
Vale lembrar também que nos exemplos usados eu considerei a criação de um arquivo swap com 16GB chamado /SWAPFILE. Nem o tamanho ou tão pouco o nome e local do arquivo são obrigatórios. Altere estes valores conforme a sua necessidade.
Uma vez que o swap esteja ativo, o seu uso será transparente para as aplicações que estiverem rodando no sistema então, agora, é só continuar trabalhando normalmente, mas com a recomendação de que se o uso do swap se tornar frequente, o ideal será você providenciar mais memória RAM.