Swap (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de Swap. Data da última tradução: 2020-04-09. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Essa página fornece uma introdução a espaço swap e paginação no GNU/Linux. Ele cobre a criação e ativação de partições swap e arquivos swap.

Do All about Linux swap space:

O Linux divide sua RAM física (memória de acesso aleatório) em pedaços de memória chamados páginas. Swapping, ou troca, é o processo pelo qual uma página de memória é copiada para o espaço pré-configurado no disco rígido, chamado espaço swap ou espaço de troca ou swap space, para liberar essa página de memória. Os tamanhos combinados da memória física e do espaço swap são a quantidade de memória virtual disponível.

Suporte para swap é fornecido pelo kernel Linux e utilitários de espaço de usuário do pacote util-linux.

Espaço swap

O espaço swap pode assumir a forma de uma partição de disco ou de um arquivo. Os usuários podem criar um espaço swap durante a instalação ou em qualquer momento posterior, conforme desejado. O espaço swap pode ser usado para duas finalidades, estender a memória virtual além da memória física instalada (RAM), também conhecido como "ativar swap", e também para suporte de suspensão para disco.

Se for benéfico ativar o swap, depende da quantidade de memória física instalada e da quantidade de memória necessária para executar todos os programas desejados. Se a quantidade de memória física for menor que a quantidade necessária, é benéfico ativar a troca. Isso evita condições de falta de memória, onde o mecanismo matador de OOM do kernel do Linux tentará automaticamente liberar memória matando processos. Para aumentar a quantidade de memória virtual para o valor necessário, adicione a diferença necessária como espaço swap. Por exemplo, se os seus programas precisarem de 7,5 GB de memória para serem executados e houver 4 GB de memória física instalada, adicione a diferença de 3,5 GB no espaço swap. Adicione mais espaço swap para atender aos requisitos futuros. É uma questão de preferência pessoal se você preferir que os programas sejam eliminados ao ativar swap. A maior desvantagem de ativar o swap é seu desempenho inferior, consulte a seção #Desempenho.

Para verificar o estado do swap, use:

$ swapon --show

Ou

$ free -h

free também indica se a memória está em falta, o que pode ser remediado habilitando swap ou aumentando swap.

Nota: Não há vantagem de desempenho para um arquivo de swap contíguo ou uma partição, ambos são tratados da mesma maneira.

Partição swap

Uma partição swap pode ser criada com a maioria das ferramentas de particionamento do GNU/Linux. Partições swap são tipicamente designadas como tipo 82. Mesmo que seja possível usar qualquer tipo de partição como swap, é recomendado usar o tipo 82 na maioria dos casos, já que o systemd detectará e montará automaticamente (veja abaixo).

Para configurar uma partição como área swap do Linux, o comando mkswap é usado. Por exemplo:

# mkswap /dev/sdxy
Atenção: todos os dados na partição especificada serão perdidos.

Para habilitar o dispositivo para paginação:

# swapon /dev/sdxy

Para habilitar essa partição swap na inicialização, adicione uma entrada ao /etc/fstab:

UUID=UUID_dispositivo none swap defaults 0 0

sendo que UUID_dispositivo é o UUID do espaço swap.

Veja: fstab para a sintaxe do arquivo

Nota:
  • A entrada fstab é opcional se a partição swap estiver localizada em um dispositivo usando o GPT. Veja a próxima subseção.
  • Se estiver usando um SSD com suporte a TRIM, considere usar defaults,discard na linha de swap no fstab. Se estiver ativando o swap manualmente com swapon, o parâmetro -d/--discard atinge o mesmo objetivo. Veja swapon(8) para detalhes.
Atenção: Habilitar descarte em configurações de RAID usando mdadm vai causar um travamento do sistema na inicialização e durante o tempo de execução, se estiver usando swapon.

Ativação por systemd

O systemd ativa partições swap com base em dois mecanismos diferentes. Ambos são executáveis em /usr/lib/systemd/system-generators. Os geradores são executados na inicialização e criam unidades systemd nativas para montagens. O primeiro, systemd-fstab-generator, lê o fstab para gerar unidades, incluindo uma unidade para swap. O segundo, systemd-gpt-auto-generator inspeciona o disco raiz para gerar unidades. Ele opera somente nos discos GPT e pode identificar as partições swap pelo tipo GUID, consulte systemd (Português)#Montagem automática de partição GPT para obter mais informações.

Desabilitando swap

Para desabilitar um espaço swap específico:

# swapoff /dev/sdxy

Alternativamente, use a opção -a para desabilitar todos os espaços swap.

Como o swap é gerenciado pelo systemd, ele será ativado novamente na próxima inicialização do sistema. Para desabilitar a ativação automática do espaço de swap detectado permanentemente, execute systemctl --type swap para encontrar a unit responsável .swap e aplique mask.

Arquivo swap

Como uma alternativa para criar uma partição inteira, um arquivo swap oferece a capacidade de variar seu tamanho em execução, e é mais facilmente removido completamente. Isto pode ser especialmente desejável se o espaço em disco for precioso (por exemplo, um SSD de tamanho modesto).

Atenção: Btrfs possui suporte a arquivo swap com limitações desde a versão 5.0 do kernel Linux. Veja Btrfs#Arquivo swap para mais informações.

Manualmente

Criação de arquivo swap

Para sistemas de arquivos "copy-on-write", como o Btrfs, primeiro crie um arquivo de tamanho zero, defina o atributo No_COW nele com chattr e certifique-se que a compressão está desabilitada:

# truncate -s 0 /swapfile
# chattr +C /swapfile
 # btrfs property set /swapfile compression none

Veja Btrfs#Arquivo swap para mais informações. Use fallocate para criar um arquivo swap com o tamanho de sua escolha (M = Mebibytes, G = Gibibytes). Por exemplo, para criar um arquivo swap de 512 MiB:

# fallocate -l 512M /swapfile
Nota: fallocate pode causar problemas com alguns sistemas de arquivos tal como F2FS.[1] Como uma alternativa, usar dd é mais confiável, mas mais lento:
# dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress

Defina as permissões certas (um arquivo swap legível por todos é uma imensa vulnerabilidade local):

# chmod 600 /swapfile

Após criar o arquivo no tamanho correto, formate-o para swap:

# mkswap /swapfile

Ative o arquivo swap:

# swapon /swapfile

Finalmente, edite a configuração do fstab para adicionar uma entrada para o arquivo swap:

/etc/fstab
/swapfile none swap defaults 0 0

Para informações adicionais, veja fstab#Uso.

Nota: O arquivo swap deve ser especificado por sua localização no sistema de arquivos, e não por seu UUID ou LABEL.

Remover arquivo swap

Para remover um arquivo swap, ele deve primeiro ser desligado:

# swapoff /swapfile
# rm -f /swapfile

Por fim, remova a entrada relevante do /etc/fstab.

Automatizado

systemd-swap

systemd-swap é um script para criar um espaço de swap híbrido a partir de swaps de zram, arquivos swap e partições swap. Não é um afiliado com o projeto systemd.

Instale o pacote systemd-swapAUR. Defina swapfc_enabled=1 NA seção Swap File Chunked do /etc/systemd/swap.conf. Inicie/habilite o serviço systemd-swap.

Visite a página do autor no GitHub para mais informações e instalação da configuração recomendada.

Nota: Se o journal fica mostrando o aviso a seguir systemd-swap[..]: WARN: swapFC: ENOSPC e nenhum arquivo swap está sendo criado, você precisa definir swapfc_force_preallocated=1 no /etc/systemd/swap.conf.

Criptografia swap

Veja dm-crypt/Swap criptografada.

Desempenho

As operações de swap geralmente são significativamente mais lentas do que acessar diretamente os dados na RAM. A desativação total da swap para melhorar o desempenho pode levar a uma degradação, pois diminui a memória disponível para caches VFS, causando E/S de disco mais frequente e dispendiosa.

Os valores de swap podem ser ajustados para ajudar no desempenho:

Swappiness

O parâmetro de sysctl para swappiness (isto é, a capacidade de realizar swap) representa a preferência (ou evitação) do kernel a cerca do espaço de swap. Swappiness pode ter um valor entre 0 e 100, o valor padrão é 60. Um valor baixo faz com que o kernel evite swap, um valor mais alto faz com que o kernel tente usar o espaço de swap. Sabe-se que usar um valor baixo em memória suficiente melhora a capacidade de resposta em muitos sistemas.

Para verificar o valor atual de swappiness:

$ sysctl vm.swappiness

Alternativamente, os arquivos /sys/fs/cgroup/memory/memory.swappiness ou /proc/sys/vm/swappiness podem ser lido para obter o valor inteiro não tratado.

Nota: Como /proc é muito menos organizado e é mantido apenas para propósitos de compatibilidade, você é encorajado a usar /sys.

Para definir temporariamente o valor do swappiness:

# sysctl -w vm.swappiness=10

Para definir permanentemente o valor de swappiness, crie um arquivo de configuração sysctl.d(5). Por exemplo:

/etc/sysctl.d/99-swappiness.conf
vm.swappiness=10

Para testar e mais sobre por que isso pode funcionar, dê uma olhada neste artigo.

Pressão de cache VFS

Outro parâmetro sysctl que afeta o desempenho da swap é vm.vfs_cache_pressure, que controla a tendência do kernel para recuperar a memória que é usada para armazenamento em cache de caches VFS, versus cache de páginas e swap. Aumentar esse valor aumenta a taxa na qual os caches VFS são recuperados [2]. Para mais informações, consulte a documentação do kernel Linux.

Prioridade

Se você tiver mais de um arquivo de swap ou partição de swap, considere atribuir um valor de prioridade (0 a 32767) para cada área de swap. O sistema usará áreas de swap de prioridade mais alta antes de usar áreas de swap de menor prioridade. Por exemplo, se você tiver um disco mais rápido (/dev/sda) e um disco mais lento (/dev/sdb), atribua uma prioridade mais alta à área de troca localizada no mais rápido dispositivo. Prioridades podem ser atribuídas em fstab através do parâmetro pri:

/dev/sda1 none swap defaults,pri=100 0 0
/dev/sdb2 none swap defaults,pri=10  0 0

Ou por meio do parâmetro --priority de swapon:

# swapon --priority 100 /dev/sda1

Se duas ou mais áreas tiverem a mesma prioridade e for a prioridade mais alta disponível, as páginas serão alocadas em uma base round-robin entre elas.

Usando zswap ou zram

O zswap é um recurso de kernel do Linux que fornece um cache de write-back compactado para páginas do swap. Isso aumenta o desempenho e diminui o operações de E/S. ZRAM cria um arquivo swap compactado virtual na memória como alternativa a um arquivo swap no disco.

Distribuição

Não há necessidade de usar RAID por motivos de desempenho de swap. O kernel em si pode distribuir a troca em vários dispositivos, se você apenas der a mesma prioridade no arquivo /etc/fstab. Consulte o The Software-RAID HOWTO para obter detalhes.