Понимание поведения использования метаданных в недавно преобразованной файловой системе btrfs

Понимание поведения использования метаданных в недавно преобразованной файловой системе btrfs

У меня есть жесткий диск на 5 ТБ с 3,3 ТиБ (по данным du) медиафайлов в 119 тыс. файлов и каталогов; средний размер файла составил около 28 МБ. Я преобразовал раздел ext4 в btrfs с помощью btrfs-convert. Процесс занял 10,4 часа и был связан с процессором. Сразу после преобразования:

# btrfs fi df /mnt/btrfs/
Data, single: total=3.03TiB, used=2.21TiB
System, single: total=32.00MiB, used=236.00KiB
Metadata, single: total=1.52TiB, used=1.10TiB

btrfs выделил все пространство на жестком диске (3,03 + 1,52 ТиБ ≈ 5 ТБ), и, по-видимому, поместил ~1 ТиБ содержимого файла в фрагменты метаданных (использовано 1,10 ТиБ). Это неожиданно, поскольку очень немногие из моих файлов поместились в конечные узлы.

Стандартное решение для огромного распределения метаданных — перебалансировка метаданных. btrfs balance start -mзаняло 8,0 часов и было ограничено вводом-выводом. После этого, похоже, btrfs не только освободила неиспользуемые фрагменты метаданных, но и переместила содержимое файлов из фрагментов метаданных в фрагменты данных.

# btrfs fi df /mnt/btrfs/
Data, single: total=3.32TiB, used=3.31TiB
System, single: total=32.00MiB, used=104.00KiB
Metadata, single: total=3.00GiB, used=2.18GiB

Может кто-нибудь объяснить, что происходит? Почему "метаданные" изначально потребляют 1,10 ТиБ, и почему балансировка уменьшит их до 2,18 ГиБ? btrfs balanceПеремещает ли содержимое файла из фрагментов метаданных в фрагменты данных?

Я использовал ядро ​​Linux 3.13.0-46. У моих файлов нет жестких ссылок, xattrs, контекстов SELinux или ACL. Я не включал сжатие и не удалял образ отката ext4.

решение1

Во-первых, процесс преобразования сохраняет копию всех прежних системных метаданных в новых метаданных, что может занимать значительный объем места на больших дисках.

Во-вторых, процесс преобразования запутан и приводит к чрезвычайно большим экстентам, поскольку экстенты в EXT4 также большие, и BTRFS будет наследовать их размер.

Выделенный размер становится примерно в 1,5 раза больше размера используемых метаданных. Процесс дефрагментации уменьшит размер используемых метаданных, но не изменит распределение. Также есть опция тощих экстентов для дальнейшего уменьшения метаданных, но она более полезна в системах с большим количеством небольших файлов; распределение метаданных составляет менее десятой доли процента, что очень мало.

Команда balance ДОЛЖНА уменьшить размер выделения до нового значения на основе текущего использования метаданных, что, похоже, она сделала правильно. Команда balance не должна перемещаться из метаданных в данные, но это может быть связано с тем, что исходная копия образа метаданных EXT4 находилась в исходном выделении метаданных, а теперь перемещена в данные (подтом ext2_saved). Проверьте размер образа EXT4, чтобы убедиться, что он составляет 1,1 ТБ. Независимо от этого, я бы дефрагментировал файловую систему.

Следует отметить, что запуск балансировки без дефрагментации может привести к ошибкам. Для предотвращения проблем с файловой системой рекомендуются более новые версии ядра, в частности 3.17 и более поздние.

Связанный контент