# Zswap

zswap é um recurso do núcleo Linux que fornece um cache write-back compactado para páginas trocadas, como uma forma de compactação de memória virtual. Em vez de mover as páginas de memória para um dispositivo de troca quando elas devem ser trocadas, o zswap executa sua compactação e as armazena em um conjunto de memórias alocado dinamicamente na RAM do sistema. Posteriormente, a escrita para o dispositivo de troca real é adiado ou mesmo completamente evitado, resultando em uma E/S significativamente reduzida para sistemas Linux que requerem troca; a desvantagem é a necessidade de ciclos adicionais de CPU para realizar a compactação.
Como resultado da redução de E/S, o zswap oferece vantagens a vários dispositivos que usam armazenamento baseado em flash, incluindo dispositivos incorporados, netbooks e dispositivos de hardware de baixo custo semelhantes, bem como a outros dispositivos que usam unidades de estado sólido (SSDs) para armazenamento. A memória flash tem uma vida útil limitada devido à sua natureza, portanto, evitar que ela seja usada para fornecer espaço de troca evita que ela se desgaste rapidamente.

## Funcionamento interno

O zswap é integrado ao restante do subsistema de memória virtual do núcleo Linux usando a API fornecida pelo frontswap, que é um mecanismo do núcleo Linux que abstrai vários tipos de armazenamento que podem ser usados como espaço de troca. Como resultado, o zswap opera como um driver backend para o frontswap ao fornecer o que é visível internamente como um dispositivo pseudo-RAM. Em outras palavras, a API frontswap torna o zswap capaz de interceptar páginas de memória enquanto elas estão sendo trocadas e capazes de interceptar falhas de página para as páginas já trocadas; o acesso a esses dois caminhos permite que o zswap funcione como um cache de write-back compactado para páginas trocadas.
Internamente, o zswap usa módulos de compactação fornecidos pela API de criptografia do núcleo Linux, o que torna possível, por exemplo, descarregar as tarefas de compactação da CPU principal usando qualquer um dos aceleradores de compactação de hardware suportados pelo núcleo Linux. A seleção do módulo de compressão desejado pode ser executada dinamicamente no tempo de inicialização através do valor do parâmetro de inicialização do núcleo zswap.compressor; se não for especificado, o padrão é deflate, que seleciona a compactação Lempel–Ziv-Oberhumer (LZO). A partir da versão 3.13 do núcleo Linux, o zswap também precisa ser explicitamente habilitado especificando o valor 1 para o parâmetro de inicialização do núcleo zswap.enabled.
O tamanho máximo do conjunto de memórias usado pelo zswap é configurável através do parâmetro max_pool_percent do sysfs, que especifica a porcentagem máxima da RAM total do sistema que pode ser ocupada pelo conjunto. O conjunto de memórias não é pré-alocado para seu tamanho máximo configurado e, em vez disso, aumenta e diminui conforme necessário. Quando o tamanho máximo do conjunto configurado é atingido como resultado da troca executada, ou quando o crescimento do conjunto é impossível devido a uma condição de falta de memória, as páginas trocadas são removidas do conjunto de memórias para um dispositivo de troca no menos utilizado recentemente (LRU). Essa abordagem torna o zswap um verdadeiro cache de troca, pois as páginas mais antigas armazenadas em cache são despejadas em um dispositivo de troca quando o cache está cheio, abrindo espaço para que novas páginas trocadas sejam compactadas e armazenadas em cache.
O zbud é um alocador de memória de propósito especial usado internamente pelo zswap para armazenar páginas compactadas, implementado como uma reescrita do alocador zbud usado pelo zcache da Oracle, que é outra implementação de compactação de memória virtual para o kernel do Linux. Internamente, o zbud funciona armazenando até duas páginas compactadas ("buddies", daí o nome do alocador) por página de memória física, o que traz vantagens devido à fácil união e reutilização do espaço liberado e desvantagens devido à possível utilização de memória menor. No entanto, como resultado de seu design, o zbud não pode alocar mais espaço de memória do que seria originalmente ocupado pelas páginas descompactadas.

## História

zswap e zbud foram criados por Seth Jennings. O primeiro anúncio público foi em dezembro de 2012, e o desenvolvimento continuou até maio de 2013, altura em que a base de código atingiu a sua maturidade, apesar de ainda ter o status de uma funcionalidade experimental do núcleo.
O zswap (junto com o zbud) foi fundido na linha principal do núcleo Linux no núcleo versão 3.11, que foi lançado em 2 de setembro de 2013.
Desde a versão 3.15 do núcleo do Linux, que foi lançado em 8 de junho de 2014, o zswap suporta corretamente vários dispositivos de troca.

## Alternativas

Uma das alternativas para o zswap é o zram, que fornece um mecanismo semelhante, mas ainda diferente "páginas de troca comprimidas na RAM" para o núcleo Linux.
A principal diferença é que o zram fornece um dispositivo de bloco compactado usando RAM para armazenamento de dados, que funciona como um dispositivo de troca regular e separado. O uso do zram requer configuração adicional no espaço de usuário, usando os utilitários de linha de comandos mkswap e swapon, para que o dispositivo de troca baseado em RAM fornecido pelo zram seja inicializado e configurado para ser usado. Como resultado de seu design, o zram pode fornecer espaço de troca mesmo se nenhum outro dispositivo de troca estiver disponível, o que torna o zram mais adequado para sistemas que ainda não fornecem espaço de troca, como dispositivos incorporados.
Em comparação, o zswap opera de forma transparente e não requer configuração adicional no espaço de usuário e atua como um cache compactado baseado em RAM para dispositivos de troca regulares. Isso fornece ao zswap um mecanismo de despejo para páginas trocadas menos usadas, o qual o zram não possui. Embora, como resultado de seu projeto, pelo menos um dispositivo de troca já existente é necessário para que o zswap seja usado.