Баланс btrfs также дефрагментирует файлы?

9

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

В разделе часто задаваемых вопросов есть «Что делает« баланс »?» , что непонятно по этому вопросу:

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

Благодаря тому, как работает баланс, он также имеет некоторые полезные побочные эффекты:

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

Ответы:

10

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. Хотя порции обычно имеют размер 1 ГБ, они могут быть больше или меньше. При использовании raid-типов чанки обычно распределяются по нескольким дискам с кратностью 1 ГБ. Например, для 5 дисков с raid0 обычно получается полоса размером 5 ГБ, состоящая из порций по 1 ГБ, записываемых на каждый диск.

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

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

  4. Исключением является функция nocow.

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

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

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

zaTricky
источник
Вау, отличный ответ. Я вижу, что существует серьезная нехватка информации, относящейся к пользователям BTRFS, в книгах или тому подобном (скорее, в отличие от ZFS), которая, кажется, способствует ее плохой репутации. У вас есть блог или еще что-нибудь хорошее?
Эндрю Кич
1
Спасибо! Я действительно должен принести туда более современный контент. : - | Времени очень не хватало: dogma.swiftspirit.co.za
zaTricky
6

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

предпочитать 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 будет распределяться таким образом, что дефрагментация не понадобится. Что вы могли бы рассмотреть форму неявной дефрагментации.

НТН

пользователь
источник
3

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

Габриель
источник
0

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

user203842
источник
3
Если вы не получаете доступ к данным с SSD-накопителя, это ничего не значит.
Мэтт
1
Это не отвечает на вопрос.
Карл Рихтер
-2

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

Рональд Поттол
источник
6
Фрагментация на самом деле не проблема для ext2 / 3/4, xfs, jfs и т. Д., Но она может быть серьезной проблемой для btrfs. См. Btrfs.wiki.kernel.org/index.php/Gotchas, где говорится: «Файлы с большим количеством случайных записей могут сильно фрагментироваться (более 10000 экстентов), вызывая перегрузку на жестких дисках и чрезмерные скачки загрузки процессора в течение нескольких секунд в системах с SSD или большое количество оперативной памяти. " Это не преувеличение, даже для обычных случаев использования (файлы, загруженные с помощью bittorrent, баз данных sqlite и т. Д.).
nemequ
2
Дефрагментация может сильно измениться даже с более современными файловыми системами, особенно после того, как накопитель начинает заполняться на обычном жестком диске. Некоторые файловые системы справляются с этим лучше, чем другие, а некоторые типы файлов справляются хуже других. Свободное пространство, невозможность оптимизации сценариев, кэши чтения / записи, чтение заголовков, оптимизация приложений и т. Д. Имеют тенденцию скрывать многое из этого. По большей части люди не должны беспокоиться об этом и должны беспокоиться только о том, действительно ли у них есть серьезные проблемы, которые могут быть вызваны фрагментацией.
jgmjgm