btrfs: A cópia resultante é o dobro do tamanho da fonte

2

Acabei de receber um SSD e queria migrar minha instalação atual do Ubuntu para aproveitar seu desempenho.

Então eu inicializei com um CD live do Ubuntu, com as unidades de origem (ext4) e de destino (SSD, btrfs montados com compress-force=zlib,nodatacow,noatime,rw,ssd ) e comecei a copiar arquivos usando o rsync:

sudo rsync -av --exclude=/home/ '/media/username/source/' '/media/username/target'

# /home stays on HDD for now

O Rsync terminou o trabalho sem problemas. A contagem de arquivos é semelhante (cerca de 1,2 milhões de arquivos, número obtido por clique com o botão direito > propriedades no Nautilus), mas a cópia resultante é de 31 GB, muito maior do que a fonte que é de apenas 18 GB.

Tamanhos verificados por vários métodos:

  • df
  • Clique com o botão direito > Propriedades
  • btrfs filesystem df
  • Baobab

Todos deram resultados semelhantes, a fonte é bem menor.

Eu sei que o btrfs usa algum tipo de diário de metadados e "cópias de sombra" de arquivos quando o COW está ativado. Mas o COW está desligado e, mesmo se estivesse ligado, a primeira população de dados, além de 12 GB de 32 GB, poderia ser metadados; certo? o.o

Alguma idéia sobre o WTH está acontecendo? ou melhor ainda, como consertar isso?

    
por eridani 26.04.2015 / 05:47

1 resposta

1

Por padrão, o btrfs coloca arquivos menores que 4 KiB em blocos de metadados (para evitar buscas extras que ocorreriam se os dados fossem colocados longe dos metadados); isso é controlado pela max_inline mount option . Além disso, o btrfs duplicará os metadados por padrão, a menos que mkfs.btrfs detecte que o dispositivo selecionado não é rotacional ao criar o sistema de arquivos; isso é controlado pela --metadata opção em mkfs.btrfs . Em conjunto, isso significa que o tamanho do disco de cada arquivo menor que 4 KiB é pelo menos duas vezes o tamanho real dos dados.

Com 1,2 milhões de arquivos e 18 GB, o tamanho médio de seus arquivos é de 16 KB, e eu suspeito que muitos deles são menores que 4 KiB. Isso pode explicar o aumento significativo no uso do espaço em disco sobre o ext4.

No entanto, essa explicação é suspeita porque o ext4 - como a maioria dos sistemas de arquivos - também é ineficiente para armazenar arquivos com menos de 4 KiB, já que o tamanho padrão é 4 KiB, o que significa que cada arquivo ocupa pelo menos esse espaço no disco . O Btrfs é diferente aqui, pois empacota os dados embutidos em seus blocos de metadados. Espero que o btrfs se torne mais eficiente em termos de espaço que o ext4 (sob as opções padrão atuais) para arquivos menores que 2 KiB.

Assim, acho que minha explicação aqui está errada a menos que você tenha muitos arquivos entre 2 KiB e 4 KiB, ou você está usando opções não-padrão para ext4 ou btrfs.

Mas se essa explicação estiver correta, você poderá reduzir o uso de espaço em disco no btrfs não duplicando metadados: basta especificar a opção --metadata single ao invocar mkfs.btrfs (obviamente, isso reduz a redundância, portanto o sistema de arquivos será menos resiliente contra a corrupção de metadados). Para um sistema de arquivos btrfs existente, você pode converter metadados duplicados em metadados únicos usando filtros de equilíbrio .

É possível desabilitar inlining de dados usando a opção max_inline=0 mount, mas eu não recomendo isso porque ele se depara com o problema de eficiência de espaço para arquivos pequenos que o ext4 e outros sistemas de arquivos enfrentam.

    
por Vincent Yu 06.07.2015 / 11:35