Назад | Перейти на главную страницу

Btrfs balance также дефрагментирует файлы?

Когда я бегу btrfs filesystem balance, это неявная дефрагментация файлов? Я мог представить, что баланс просто перераспределяет экстент каждого файла отдельно, сохраняя существующую фрагментацию.

Есть запись в FAQ, 'Что делает "баланс"?', что неясно по этому поводу:

Баланс файловой системы btrfs - это операция, которая просто берет все данные и метаданные в файловой системе и повторно записывает их в другое место на дисках, передавая их через алгоритм распределителя по пути. Первоначально он был разработан для файловых систем с несколькими устройствами, чтобы более равномерно распределять данные по устройствам (то есть «балансировать» их использование). Это особенно полезно при добавлении новых устройств в почти полную файловую систему.

Из-за того, как работает этот баланс, у него также есть несколько полезных побочных эффектов:

  • Если выделено много, но неиспользуемых данных или фрагментов метаданных, баланс может вернуть часть выделенного пространства. Это основная причина использования баланса в файловой системе с одним устройством.
  • В файловой системе с поврежденной репликацией (например, файловая система RAID-1 с мертвым и удаленным диском) это заставит FS восстановить недостающую копию данных на одном из активных в настоящее время устройств, восстанавливая возможности RAID-1 системы. файловая система.

TL; DR

Функция дефрагментации Btrfs предназначена для исправления фрагментации метаданных папок и содержимого файлов, в то время как функция баланса была создана для "баланс«(отсюда и название) - объем данных, совместно используемых дисками при добавлении или удалении диска. Хотя они имеют некоторое теоретическое совпадение в том, что они делают, они не связаны напрямую, поэтому документация не связывает эти две функции.

Подробный ответ ниже. Заметьте, конечно, что мой длинный ответ основан на надежде, что он поможет другим, не имеющим полного контекста возникших проблем.


Распределение фрагментов

Важной концепцией btrfs является распределение фрагментов. Когда вы записываете данные в btrfs, он записывает эти данные в «текущий» блок, обычно размером 1 ГБ.1. Если «текущий» блок становится заполненным, он выделяет новый блок. Если существующий фрагмент опустошается, его пространство памяти становится доступным для перераспределения, когда требуется новый фрагмент.

Если файловая система использует более одного диска с «dup», «single» или «raid1» профили хранения, распределитель фрагментов всегда предпочитает помещать следующий новый фрагмент на диски с наибольшим доступным свободным пространством. Это обычно гарантирует, что диски используются одинаково.


Как баланс делает свое дело

Функция баланса работает, беря существующие фрагменты данных и перезаписывая их в «текущий» фрагмент. Когда существующий кусок очищается таким образом, он автоматически становится доступным для распределителя. Если очищаемый существующий блок не был заполнен с самого начала (возможно, старые данные в блоке были удалены), чистым результатом является освобождение дискового пространства, поскольку новый блок «более плотно упакован» соответствующими данными.

Это та часть, которая теоретически может использоваться как часть стратегии дефрагментации., что, как мне кажется, является причиной того, что многие люди так думают. Однако, конечно, функция баланса была построена с определенной целью, поэтому почему она не посмотрите на содержимое файла. Это только проверяет, актуальны ли данные, которые он извлекает из существующих блоков2 перед копированием этих данных в новый блок.

Где Баланс часть зайти?

Когда вы добавляете новый диск в файловую систему, распределитель сначала стремится записывать все новые данные на новый диск, в основном потому, что на нем больше свободного места, чем на существующих дисках. При перезаписи всех фрагментов все изначально сбалансированные фрагменты записываются только на новый диск. После выравнивания (балансировки) остальные данные будут равномерно перераспределены между дисками.

Типичный сценарий баланса:

У меня есть 2 диска по 500 ГБ, на каждом из которых используется 240 ГБ; Добавляю еще диск на 500Гб. Обычно у меня есть:

  • диск A: используется 240 ГБ
  • диск b: используется 240 ГБ
  • диск c: используется 0 ГБ

Начинаю балансировать все данные. Примерно через четверть баланса я, вероятно, увижу ситуацию, подобную следующей:

  • диск A: используется 180 ГБ
  • диск b: используется 180 ГБ
  • диск c: занято 120 ГБ

Примерно на отметке в одну треть он кажется сбалансированным:

  • диск A: используется 160 ГБ
  • диск b: используется 160 ГБ
  • диск c: используется 160 ГБ

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


Как происходит фрагментация в btrfs

Btrfs - это CoW (Копирование при записи) файловой системы, что означает, что данные никогда переписанный4. Если у вас есть существующий файл размером 100 МБ и вы перезаписываете часть файла размером 1 МБ, эта часть размером 1 МБ не записывается поверх существующих данных на диске. Вместо этого он записывается где-нибудь в «текущем» фрагменте. Btrfs отслеживает, где хранятся эти «фрагменты» новых данных. Это наиболее полезно для сохранения моментальных снимков данных, поскольку это означает, что старые данные сохраняются по умолчанию. Поскольку твердотельные накопители, очень похожим образом, никогда не перезаписывают данные, этот механизм CoW хорошо подходит для сохранения срока службы и производительности SSD.

Где появляется дефрагментация

Независимо от преимуществ, некоторые файлы очень часто перезаписываются (обычно файлы базы данных), поэтому в конечном итоге таких фрагментов сотни. С твердотельными накопителями в краткосрочной перспективе наблюдается небольшое снижение производительности. Но со шпиндельными приводами снижение производительности очень велико.

Одним из решений, конечно же, является использование функции дефрагментации btrfs. Операция дефрагментации перезаписывает содержимое файла в текущем фрагменте в логическом порядке его текущего состояния, тем самым сокращая фрагменты в один большой набор данных размером 100 МБ вместо множества отдельных частей.

Альтернативным решением было бы использовать функцию «nocow» специально для таких файлов. Функция nocow заставляет файл перезаписываться на месте. Помните, что есть предостережения.5 6.


Резюме снова

  • Баланс смотрит на фрагменты и полосы - и на самом деле не знает о содержимом файла, за исключением того, актуальны ли данные в этих фрагментах.

  • Операция дефрагментации просматривает данные папки и содержимое отдельного файла и повторно записывает данные как можно более непрерывно. Обратной стороной являются снимки состояния, в которых дефрагментация приводит к дублированию и дополнительному использованию диска.


Ноты:

  1. Хотя блоки обычно имеют размер 1 ГБ, они могут быть больше или меньше. При использовании рейдового типа чанки обычно распределяются по нескольким дискам в количестве, кратном 1 ГБ. Например, 5 дисков с raid0 обычно приводят к тому, что на каждый диск записывается полоса размером 5 ГБ, состоящая из блоков по 1 ГБ.

  2. Btrfs использует «ссылки» на содержимое файла. Когда часть файла перезаписывается, действующая файловая система «ссылается» на место, где были записаны эти данные. Однако снимок может по-прежнему «ссылаться» на старое местоположение. Если моментального снимка нет - или старый снимок удален, это приводит к тому, что не остается никаких «ссылок», относящихся к исходному перезаписанному содержимому. Это содержимое считается нерелевантным и не будет скопировано с другими релевантными данными в операции баланса.

  3. На этом этапе предполагается, что хранилище использует простой "единственный" профиль.7, первые сбалансированные 160 ГБ все можно перенести на новый диск, но и на данный момент у него еще осталось около 320 ГБ для балансировки. Остальные будут равномерно сбалансированы по дискам. При использовании шпинделей в идеале вам нужно сбалансировать только 160 блоков, прежде чем btrfs повторно балансирует все 3 диска для лучшего «распределения» данных. При использовании твердотельных накопителей попытка поддерживать равномерный "разброс" данных становится очень сложной, вероятно, бессмысленной и гораздо более вероятной. очень плохо сказывается на сроке службы SSD.

  4. Исключение составляет функция «сейчас».

  5. Если есть моментальные снимки, дефрагментация «живого» файла приводит к тому, что моментальные снимки и «живой» файл ссылаются на разные местоположения данных на диске, в результате чего данные дублируются и, таким образом, занимают дополнительное дисковое пространство. Когда станет доступна универсальная функция дедупликации, это не будет большой проблемой.

  6. Использование nocow означает, что btrfs не поддерживает контрольные суммы для содержимого файла.

  7. В большинстве типов RAID (raid1 является исключением), «распространение» по всем дискам спорно, как полосы, как правило, написаны по все все равно ездит.

Может быть, глядя на исходный код команды может помочь

Предпочитаю btrfs balance start

Команда 'btrfs filesystem balance' устарела, используйте вместо нее команду 'btrfs balance start'.

А затем в командной строке

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

Я мог бы взглянуть на это еще раз, но я не вижу ни ссылок на дефрагментацию структур, ни на вызовы ioctl (). Так что явной дефрагментации нет.

Все, что он делает, это копирует из одного места в другое и использует в процессе распределитель по умолчанию. Взято отсюда

В зависимости от назначения и режима распределения алгоритм либо напрямую ищет непрерывный объем свободного пространства в каждой подходящей группе распределения (группа в btrfs соответствует блоку, описанному выше

Таким образом, в зависимости от режима выделения, свободного места на устройстве и т. Д. Вы можете сказать, что btrfs будет распределяться таким образом, что дефрагментация не потребуется. Что вы могли бы считать формой неявной дефрагментации.

HTH

Баланс работает на уровне фрагментов; чанки - это то, как Btrfs реализует избыточность рейдов. Он ничего не делает на уровне Btree и не дефрагментирует.

Если вы используете носители с высокой задержкой доступа, фрагментация учитывается всегда, независимо от используемой файловой системы. Поиск остается на неделю, период.

Дефрагментация переоценена. Конечно, на FAT16 это имеет значение, но в большинстве случаев не на чем-либо современном. Фактически, ребалансировка улучшит организацию вашей файловой системы, и файлы будут менее фрагментированы.