O que é a desduplicação no OpenZFS?
- Definição de desduplicação: no OpenZFS, antes de gravar dados no disco, o sistema verifica se esses dados já existem no disco e, se existirem, não faz uma nova gravação, apenas adiciona uma referência à cópia existente.
- Desafios da desduplicação: é difícil verificar se os dados já estão no disco e saber sua localização. Isso exige operações adicionais de entrada e saída (IO), o que pode causar queda de desempenho.
Como a desduplicação funciona?
- Modo de funcionamento: quando a desduplicação está ativada, um bloco de dados é preparado e seu checksum é calculado. Antes, o alocador de metaslab reservava o espaço, mas com a desduplicação ativada o checksum é consultado na tabela de desduplicação.
- Tabela de desduplicação: é armazenada na forma de uma tabela hash que usa o checksum como chave e a localização no disco e a contagem de referências como valor. Isso é considerado parte dos metadados do pool.
Problemas da desduplicação tradicional
- Problema da tabela de desduplicação: a desduplicação tradicional é implementada usando o objeto de tabela hash em disco do OpenZFS. Trata-se de uma estrutura complexa, inadequada para aplicações como desduplicação.
- Uso de memória: a leitura da tabela de desduplicação fica em cache no ARC e, se houver RAM suficiente, é possível reduzir a parte de leitura das atualizações da tabela.
- Problema dos itens únicos: o espaço necessário para rastrear itens únicos na tabela de desduplicação é um problema. Blocos com contagem de referência igual a 1 ocupam espaço na tabela de desduplicação e, se os mesmos dados não forem gravados novamente, esse custo não pode ser recuperado.
Como a desduplicação rápida resolve esse problema?
- Redução da lista de itens ativos: para reduzir o uso de memória, diminui-se a pegada de memória da lista de itens ativos. Na nova tabela de desduplicação, a parte de "valor" de cada item foi reduzida para 72 bytes.
- Log de desduplicação: em vez da lista de itens ativos, usa-se um log para registrar mudanças e reproduzi-lo na recuperação após falha. O log é armazenado em memória para permitir consultas rápidas.
- Flush incremental do log: para controlar o tamanho do log, parte dele é gravada no ZAP a cada transação. Quando há pressão de memória, o flush do log é acelerado.
Resumo do GN⁺
- O novo recurso "FastDedup" do OpenZFS foi desenvolvido para resolver os problemas da desduplicação tradicional. Ele reduz o uso de memória e permite um gerenciamento de dados mais eficiente por meio de logs.
- A desduplicação só é útil em cargas de trabalho específicas e ainda pode ser ineficiente para uso geral. Isso acontece porque o overhead de gerenciamento da tabela de desduplicação é alto.
- Um projeto semelhante é o recurso de desduplicação do Btrfs, que pode ser uma alternativa em outros sistemas de arquivos.
1 comentários
Comentários do Hacker News
Cliquei pelo título, mas, mesmo sem ter interesse em ZFS, acabei lendo quase tudo. O texto explicava tudo com clareza, e gostei especialmente do tema CSS para mobile. Há um resumo conciso no fim do texto.
Além da discussão sobre
copy_file_range, seria bom se o sistema de arquivos pudesse encontrar arquivos de 1 MB ou mais com o mesmo hash e aplicar deduplicação de forma seletiva.O problema da deduplicação tradicional é que a sobrecarga é grande demais, então é difícil ver benefício fora de cargas de trabalho específicas. Vi economia de 3:1 com deduplicação/compressão em cargas de trabalho de VMWare em arrays da Pure e da Dell/EMC.
A eficácia da deduplicação é muito influenciada pelo tamanho dos blocos que são hasheados. Quanto menor o bloco, maior a chance de haver blocos coincidentes. Pessoalmente, prefiro blocos de 4 KB.
Quero deduplicação "offline" ou "preguiçosa". Quando a deduplicação está ativada, toda operação de escrita e liberação exige consultas e gravações na tabela de deduplicação. Quero que a gravação dos dados termine rápido.
Estou muito animado com a deduplicação rápida. Queria usar a deduplicação do ZFS nos dados do ArchiveBox. Parece que vai ficar possível arquivar muitas URLs e deixar o sistema de arquivos comprimir tudo.
Venho usando a deduplicação do ZFS em um arquivo pessoal e, no momento, ela está reduzindo o espaço em disco em 3 vezes. O ZFS funcionou muito bem em termos de confiabilidade e ajudou a evitar perda de dados.
A deduplicação genérica parece boa na teoria, mas na prática não funciona bem. O IPFS tenta deduplicar dados usando fragmentos de tamanho variável, mas na prática isso não faz diferença e só aumenta a complexidade.
Seria bom se o hardware dedicado dos controladores de disco fosse aprimorado para expor ao sistema os hashes dos blocos para cálculos como ECC.
Gostaria que a API do sistema de arquivos fosse de uma forma completamente diferente. As APIs de sistema de arquivos de todos os sistemas operacionais estão engessadas por causa da compatibilidade.
Se o desempenho de escrita é importante, não é necessário fazer deduplicação no momento da gravação. A deduplicação pode ser feita depois, em paralelo e com baixa prioridade.