O btrfs balance também desfragmenta arquivos?

9

Quando executo btrfs filesystem balance, isso desfragmenta implicitamente os arquivos? Eu poderia imaginar que o equilíbrio simplesmente realoca cada extensão de arquivo separadamente, preservando a fragmentação existente.

Existe uma entrada na FAQ, 'O que o "saldo" faz? " , o que não está claro neste ponto:

O btrfs filesystem balance é uma operação que simplesmente pega todos os dados e metadados no sistema de arquivos e os reescreve em um local diferente nos discos, passando-o pelo algoritmo do alocador no caminho. Ele foi originalmente projetado para sistemas de arquivos com vários dispositivos, para espalhar os dados de maneira mais uniforme entre os dispositivos (ou seja, para "equilibrar" seu uso). Isso é particularmente útil ao adicionar novos dispositivos a um sistema de arquivos quase cheio.

Devido à maneira como o equilíbrio funciona, ele também tem alguns efeitos colaterais úteis:

  • Se houver muitos dados alocados, mas não utilizados, ou pedaços de metadados, um saldo poderá recuperar parte desse espaço alocado. Esse é o principal motivo para executar um saldo em um sistema de arquivos de dispositivo único.
  • Em um sistema de arquivos com replicação danificada (por exemplo, um RAID-1 FS com um disco morto e removido), ele forçará o FS a reconstruir a cópia ausente dos dados em um dos dispositivos atualmente ativos, restaurando a capacidade RAID-1 do sistema de arquivo.
pauldoo
fonte

Respostas:

9

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:

  1. 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.

  2. 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.

  3. 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.

  4. A exceção é o recurso "nocow".

  5. 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.

  6. Usar nocow significa que o btrfs não mantém somas de verificação para o conteúdo do arquivo.

  7. 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.

zaTricky
fonte
Uau, ótima resposta. Vejo que há uma grave escassez de informações relevantes para o usuário do BTRFS, em livros ou similares (um pouco ao contrário do ZFS), que parece contribuir para sua má reputação contínua. Você tem um blog ou mais coisas boas como essa?
Andrew Keech
1
Obrigado! Eu realmente deveria trazer um conteúdo mais atualizado lá. : - | Faltava muito tempo: dogma.swiftspirit.co.za
zaTricky
6

Talvez olhar o código fonte do comando possa ajudar

Preferir btrfs balance start

O comando 'btrfs filesystem balance' foi descontinuado, use o comando 'btrfs balance start'.

E então na cadeia de comando

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Eu poderia dar uma segunda olhada, mas não consigo ver nenhuma referência para desfragmentar nas estruturas nem nas chamadas ioctl (). Portanto, não há desfragmentação explícita.

Tudo o que faz é copiar de um local para outro e usar o alocador padrão no processo. Retirado daqui

Dependendo da alocação de finalidade e do modo de alocação, o algoritmo pesquisa diretamente uma extensão contínua de espaço livre em cada grupo de alocação adequado (um grupo em btrfs corresponde a uma parte descrita acima

Portanto, dependendo do modo de alocação, espaço livre no dispositivo e assim por diante, você pode dizer que o btrfs será alocado de tal maneira que a desfragmentação não seja necessária. Que você pode considerar uma forma de desfragmentação implícita.

HTH

do utilizador
fonte
3

O equilíbrio funciona no nível do bloco; pedaços são como o Btrfs implementa a redundância de raide. Não faz nada no nível Btree e não desfragmenta.

Gabriel
fonte
0

Caso você use mídia com alta latência de acesso, a framentação sempre conta, independentemente do sistema de arquivos usado. Uma busca permanece uma busca, período.

user203842
fonte
3
A menos que você esteja acessando os dados da unidade SSD, isso não significa nada.
30513 Matt
1
Isso não responde à pergunta.
19617 Karl Richter
-2

A desfragmentação é superestimada. Claro, em um FAT16, faz uma diferença real, mas não em nada moderno, na maioria dos casos. Efetivamente, o reequilíbrio melhorará a organização do seu sistema de arquivos e os arquivos serão menos fragmentados.

Ronald Pottol
fonte
6
A fragmentação não é realmente um problema para ext2 / 3/4, xfs, jfs etc., mas pode ser um problema significativo para btrfs. Consulte btrfs.wiki.kernel.org/index.php/Gotchas, que diz "Arquivos com muitas gravações aleatórias podem ficar muito fragmentados (mais de 10000 extensões), causando lixeira nos HDDs e picos excessivos de vários segundos na carga da CPU em sistemas com um SSD ou grande quantidade de RAM ". Isso não é um exagero, mesmo para casos de uso comuns (arquivos baixados com bittorrent, bancos de dados sqlite etc.).
26714 nemequ
2
A desfragmentação pode fazer uma diferença muito grande, mesmo com sistemas de arquivos mais modernos, especialmente quando a unidade começa a ficar cheia em um disco rígido convencional. Alguns sistemas de arquivos lidam com isso melhor do que outros e alguns tipos de arquivos são piores do que outros. Espaço livre, impossível otimizar cenários, caches de leitura / gravação, readahead, otimização de aplicativos e assim por diante tendem a esconder muito disso. Na maioria das vezes, as pessoas não precisam se preocupar com isso e só devem se preocupar se realmente tiverem um problema sério que possa ser causado por fragmentação.
Jgmjgm