TL; DR
O recurso de desfragmentação do Btrfs é específico para corrigir a fragmentação nos metadados da pasta e no conteúdo do arquivo, enquanto o recurso de saldo foi criado para " equilibrar " (daí o nome) a quantidade de dados compartilhados entre as unidades sempre que uma unidade é adicionada ou removida. Embora eles tenham alguma sobreposição teórica no que fazem, eles não estão diretamente relacionados, portanto, a documentação não vincula os dois recursos.
Resposta detalhada abaixo. Note, é claro, que minha longa resposta está na esperança de ajudar outras pessoas que não têm o contexto completo dos problemas enfrentados.
Alocação de Chunk
Um conceito importante com o btrfs é a alocação de partes. Quando você grava dados no btrfs, ele grava esses dados em um bloco "atual", geralmente com 1 GB de tamanho 1 . Se o pedaço "atual" ficar cheio, ele alocará um novo pedaço. Se um pedaço existente for esvaziado, seu espaço de armazenamento será disponibilizado para realocação quando um novo pedaço for necessário.
Se o sistema de arquivos estiver usando mais de uma unidade com os perfis de armazenamento "dup", "single" ou "raid1" , o alocador de partes sempre prefere colocar a próxima parte nova nas unidades com o maior espaço livre disponível. Isso garante, geralmente, que as unidades sejam usadas igualmente.
Como o equilíbrio faz sua coisa
O recurso de equilíbrio funciona pegando pedaços de dados existentes e reescrevendo-os no pedaço "atual". Quando um pedaço existente é esvaziado dessa maneira, ele é automaticamente disponibilizado ao alocador. Se o pedaço existente sendo esvaziado não estava cheio para começar (talvez os dados antigos no pedaço tenham sido excluídos), o resultado líquido é a liberação do espaço em disco, pois o pedaço mais recente é "mais compactado" com dados relevantes.
Essa é a parte que poderia, em teoria, ser usada como parte de uma estratégia de des fragmentação , que eu sinto ser a razão pela qual muitas pessoas assumem que já o fazem. No entanto, é claro, o recurso de balanceamento foi criado com um objetivo específico em mente, portanto, por que ele não analisa o conteúdo do arquivo. É única verifica se ou não os dados que ele está levando para fora dos blocos existentes é relevante 2 antes de copiar os dados para o novo bloco.
De onde vem a parte Balance ?
Quando você adiciona uma nova unidade ao sistema de arquivos, o alocador primeiro tende a gravar todos os novos dados na nova unidade, principalmente porque possui mais espaço livre disponível do que as unidades existentes. Reescrevendo todos os pedaços, todos os pedaços inicialmente balanceados são gravados apenas na nova unidade. Depois de equalizado (ficar equilibrado), o restante dos dados será igualmente realocado entre as unidades.
Cenário típico de saldo:
Eu tenho 2x drives de 500 GB com 240 GB usados em cada um; Eu adiciono outra unidade de 500 GB. Eu normalmente teria:
- drive a: 240GB usado
- drive b: 240 GB usado
- drive c: 0GB usado
Começo um balanço de todos os dados. Cerca de um quarto da balança, é provável que eu veja uma situação semelhante à seguinte:
- drive a: 180GB usado
- drive b: 180 GB usado
- drive c: 120GB usado
Por volta da marca de um terço, parece estar equilibrado:
- drive a: 160GB usado
- drive b: 160GB usado
- drive c: 160GB usado
Obviamente, você pode interromper a operação de balanceamento nesse momento, embora existam razões (boas e ruins) pelas quais você deseja deixá-la terminar 3 .
Como a fragmentação acontece no btrfs
Btrfs é uma vaca ( cópia na escrita ) do sistema de arquivos, o que significa que os dados são não sobre-escrito 4 . Se você possui um arquivo de 100 MB e sobrescreve uma parte de 1 MB do arquivo, essa parte de 1 MB não é gravada nos dados existentes na unidade. Em vez disso, está escrito em outro lugar no bloco "atual". O Btrfs controla onde esses "fragmentos" de novos dados são armazenados. Isso é mais útil para manter instantâneos dos dados, pois significa que os dados antigos são preservados por padrão. Como os SSDs, de maneira muito semelhante, também nunca sobrescrevem dados, esse mecanismo CoW se presta bem para permitir que os SSDs mantenham sua vida útil e desempenho.
Onde o Defrag entra
Independentemente das vantagens, alguns arquivos são substituídos com muita frequência (geralmente arquivos de banco de dados), portanto, acabam tendo centenas desses fragmentos. Com os SSDs, há pouca penalidade de desempenho no curto prazo. Mas com acionamentos de eixo, a penalidade de desempenho é severa.
Uma solução, é claro, é usar o recurso de desfragmentação do btrfs. A operação de desfragmentação reescreve o conteúdo do arquivo na parte atual na ordem lógica de seu estado atual, reduzindo assim os fragmentos em um grande conjunto de dados de 100 MB em vez de várias partes separadas.
Uma solução alternativa seria usar o recurso "nocow" especificamente para arquivos como este. O recurso nocow faz com que o arquivo seja substituído no lugar. Cuidado com as advertências a serem notadas 5 6 .
Resumo Novamente
O saldo examina partes e faixas - e não está realmente ciente do conteúdo do arquivo, exceto se os dados nessas partes ainda são relevantes.
A operação de desfragmentação examina os dados da pasta e o conteúdo do arquivo individual e reescreve os dados da maneira mais contígua possível. O lado negativo é com as capturas instantâneas em que a desfragmentação causa duplicação e uso extra da unidade.
Notas:
Embora os pedaços tenham tipicamente 1 GB de tamanho, eles podem ser maiores ou menores. Ao usar tipos de invasões, os chunks geralmente são distribuídos em várias unidades em múltiplos de 1 GB. Por exemplo, 5 unidades com raid0 normalmente resultam em uma faixa de 5 GB, consistindo em pedaços de 1 GB sendo gravados em cada unidade.
O Btrfs usa "referências" para o conteúdo do arquivo. Quando parte de um arquivo é sobrescrita, o sistema de arquivos ativo "faz referência" ao local onde esses dados foram gravados. No entanto, um instantâneo ainda pode "referenciar" o local antigo. Se não houver um instantâneo - ou o instantâneo antigo for excluído, isso resultará em nenhuma "referência" restante que se refira ao conteúdo sobrescrito original. Esse conteúdo é considerado irrelevante e não será copiado com os outros dados relevantes na operação da balança.
Nesse ponto, supondo que o armazenamento esteja usando o simples perfil "único" 7 , os primeiros 160 GB balanceados seriam todos movidos para a nova unidade - mas também neste momento, ainda resta cerca de 320 GB para equilibrar. O resto seria equilibrado igualmente entre as unidades. Com eixos, idealmente, você gostaria de equilibrar apenas 160 blocos antes de o btrfs reequilibrar todos os 3 drives para uma melhor "disseminação" dos dados. Com os SSDs, a tentativa de manter uma "dispersão" uniforme de dados fica muito complicada, provavelmente sem sentido e muito mais provavelmente muito ruim para a vida útil do SSD.
A exceção é o recurso "nocow".
Se houver capturas instantâneas, a desfragmentação do arquivo "ativo" fará com que os instantâneos e o arquivo "ativo" se refiram a locais de dados divergentes no disco, fazendo com que os dados sejam duplicados e, assim, ocupem espaço em disco extra. Quando um recurso de desduplicação de uso geral se torna disponível, isso não será um problema.
Usar nocow significa que o btrfs não mantém somas de verificação para o conteúdo do arquivo.
Na maioria dos tipos de invasões (a invasão1 é a exceção), a "dispersão" pelas unidades é discutível, pois as faixas geralmente são escritas em todas as unidades.