TL; DR
Функция дефрагментации Btrfs специфична для исправления фрагментации метаданных папок и содержимого файлов, в то время как функция баланса была создана для « баланса » (отсюда и название) объем данных, разделяемых между дисками при добавлении или удалении диска. Хотя они имеют некоторое теоретическое совпадение в том, что они делают, они не связаны напрямую, поэтому документация не связывает эти две функции.
Подробный ответ ниже. Обратите внимание, конечно, что мой длинный ответ в надежде, что он поможет другим, которые не имеют полного контекста проблем.
Распределение чанков
Важной концепцией btrfs является распределение чанков. Когда вы записываете данные в btrfs, они записывают эти данные в «текущий» блок, обычно 1 ГБ в размере 1 . Если «текущий» блок становится полным, он выделяет новый блок. Если существующий блок очищается, его пространство хранения становится доступным для перераспределения, когда требуется новый блок.
Если файловая система использует более одного диска с профилями хранения «dup», «single» или «raid1» , распределитель чанков всегда предпочитает размещать следующий новый чанк на диске (дисках) с максимально доступным свободным пространством. Это гарантирует, что диски обычно используются одинаково.
Как баланс имеет значение
Функция баланса работает, беря существующие блоки данных и перезаписывая их в «текущий» блок. Когда существующий блок очищается таким образом, он автоматически становится доступным для распределителя. Если существующий очищаемый блок не был полон для начала (возможно, старые данные в блоке были удалены), результатом будет освобождение дискового пространства, так как новый блок «более плотно упакован» соответствующими данными.
Это та часть, которая теоретически может быть использована как часть стратегии де-фрагментации , что, по моему мнению, является причиной того, что многие люди полагают, что это уже происходит. Однако, конечно, функция баланса была построена с конкретной целью, поэтому она не смотрит на содержимое файла. Он только проверяет, соответствуют ли данные, которые он извлекает из существующих чанков, 2, прежде чем копировать эти данные в новый чанк.
Где входит часть баланса ?
Когда вы добавляете новый диск в файловую систему, распределитель сначала будет стремиться записать все новые данные на новый диск, главным образом потому, что на нем больше свободного места, чем на существующих дисках. Переписывая все чанки, все изначально сбалансированные чанки записываются только на новый диск. Как только он выровняется (станет сбалансированным), остальные данные будут одинаково перераспределены между дисками.
Типичный сценарий баланса:
У меня 2 диска по 500 ГБ, по 240 ГБ на каждом; Я добавляю еще 500 ГБ диск. Я бы обычно имел:
- диск: 240GB используется
- диск b: 240 ГБ используется
- диск c: 0GB используется
Я начинаю баланс всех данных. Примерно через четверть баланса я могу увидеть ситуацию, похожую на следующую:
- диск a: 180GB используется
- диск b: 180 ГБ используется
- диск c: 120 ГБ используется
Приблизительно на одной трети балла, это кажется сбалансированным:
- диск: 160 ГБ используется
- диск b: 160 ГБ используется
- диск c: 160 ГБ используется
Вы можете, конечно, остановить операцию балансировки на этом этапе, хотя есть причины (хорошие и плохие), почему вы можете позволить ей закончить 3 .
Как происходит фрагментация в btrfs
Btrfs является КПС ( копирование при записи ) файловой системы, а это значит , что данные никогда и не переписаны 4 . Если у вас есть существующий файл размером 100 МБ и вы перезаписываете часть файла размером 1 МБ, эта часть размером 1 МБ не записывается поверх существующих данных на диске. Вместо этого это написано в другом месте в "текущем" чанке. Btrfs отслеживает, где хранятся эти «фрагменты» новых данных. Это наиболее полезно для поддержки моментальных снимков данных, поскольку это означает, что старые данные сохраняются по умолчанию. Поскольку твердотельные накопители очень похожим образом также никогда не перезаписывают данные, этот механизм CoW хорошо подходит для того, чтобы позволить твердотельным накопителям поддерживать их срок службы и производительность.
Где приходит дефрагментация
Независимо от преимуществ, некоторые файлы перезаписываются очень часто (обычно это файлы базы данных), поэтому в итоге получаются сотни этих фрагментов. С твердотельными накопителями в краткосрочной перспективе снижение производительности незначительно. Но с приводами шпинделя, производительность ухудшается.
Конечно, одним из решений является использование функции дефрагментации btrfs. Операция дефрагментации перезаписывает содержимое файла в текущем фрагменте в логическом порядке его текущего состояния, тем самым сокращая фрагменты в один большой набор данных размером 100 МБ вместо многочисленных отдельных частей.
Альтернативное решение - использовать функцию «nocow» специально для таких файлов, как этот. Функция nocow приводит к тому, что файл перезаписывается на месте. Остерегайтесь, что есть предостережения 5 5 .
Резюме Снова
Баланс учитывает фрагменты и полосы - и фактически не знает о содержимом файла, за исключением того, актуальны ли данные в этих фрагментах.
Операция дефрагментации просматривает данные папки и содержимое отдельного файла и перезаписывает данные настолько непрерывно, насколько это возможно. Обратной стороной являются снимки, где дефрагментация вызывает дублирование и дополнительное использование диска.
Ноты:
Хотя порции обычно имеют размер 1 ГБ, они могут быть больше или меньше. При использовании raid-типов чанки обычно распределяются по нескольким дискам с кратностью 1 ГБ. Например, для 5 дисков с raid0 обычно получается полоса размером 5 ГБ, состоящая из порций по 1 ГБ, записываемых на каждый диск.
Btrfs использует «ссылки» на содержимое файла. Когда часть файла перезаписывается, действующая файловая система «ссылается» на место, где были записаны эти данные. Снимок, однако, может все еще «ссылаться» на старое местоположение. Если моментальный снимок отсутствует - или старый моментальный снимок удаляется, это приводит к тому, что не остается «ссылок», которые ссылаются на исходный перезаписанный контент. Этот контент считается несущественным и не будет скопирован с другими соответствующими данными в операции баланса.
На данный момент, при условии хранения использует простой «единый» профиль 7 , первый 160GB сбалансирован бы все перенести на новый диск , - но и в этот момент, он все еще имеет около 320GB слева баланс. Остальное будет равномерно распределено по всем дискам. С помощью шпинделей в идеале вы должны сбалансировать только 160 фрагментов, прежде чем btrfs перебалансирует все 3 диска для лучшего «распространения» данных. С твердотельными накопителями попытка поддерживать равномерное «распространение» данных становится очень сложной, скорее всего, бессмысленной и, скорее всего, очень плохой для срока службы твердотельных накопителей.
Исключением является функция nocow.
Если есть моментальные снимки, дефрагментация «живого» файла приводит к тому, что моментальные снимки и «живой» файл ссылаются на расходящиеся области данных на диске, что приводит к дублированию данных и, таким образом, занимает дополнительное дисковое пространство. Когда станет доступна функция дедупликации общего назначения, это не будет такой большой проблемой.
Использование nocow означает, что btrfs не поддерживает контрольные суммы для содержимого файла.
В большинстве типов RAID (raid1 является исключением), «распространение» по всем дискам спорно , как полосы , как правило , написаны по всем дискам в любом случае.