Bcachefs: файловая система, которая не ест ваши данные

Kate

Administrator
Команда форума
Именно этот слоган (с добавлением технологии COW) написан на сайте данной файловой системы. Хотя эта файловая система входит в состав ОС Linux уже более десяти лет, о ней написано достаточно мало. В этой статье я попробую по возможности это исправить.

Итак, Bcachefs - это файловая система с использованием технологии CoW нового поколения, которая призвана предоставить функции уже достаточно распространенных BTRFS и ZFS с более стабильной кодовой базой, большей скоростью и лицензией, совместимой с GPL.

Copy On Write​

Для начала вспомним, что такое CoW. Это механизм копирования при записи. Дело в том, что файловые системы хранят файлы в виде блоков на диске, и чтобы избежать повреждения этих блоков данных в процессе записи, (например, в случае сбоя питания, что делает блок данных непригодным для использования), система CoW никогда не перезаписывает данные. Когда мы записываем в блок данных, CoW создает копию этого блока, оставляя исходный "безопасный", а затем записывает все новые данные в "блок копирования".

a36957ccf38e790a4698bccd24b2743b.png

B+ деревья​

Еще один важный элемент в структуре Bcachefs это B+ деревья. По сути, это множественное дерево с переменным, но часто большим количеством дочерних элементов на узел. Дерево B + состоит из корня, внутренних узлов и листьев. Корнем может быть либо лист, либо узел с двумя или более дочерними элементами.

Дерево B + можно рассматривать как B-дерево, в котором каждый узел содержит только ключи (не пары ключ–значение), и к которому внизу добавлен дополнительный уровень со связанными листьями.

Основная ценность дерева B + заключается в хранении данных для эффективного поиска в блочно-ориентированном контексте хранения — в частности, в файловых системах. Это прежде всего потому, что в отличие от деревьев бинарного поиска, деревья B + имеют очень высокую разветвленность (количество указателей на дочерние узлы в узле, обычно порядка 100 или более), что уменьшает количество операций ввода-вывода, необходимых для поиска элемента в дереве.



50fdf05354e59ed5b61bdf64a62a84c4.png

А вот теперь уже можно переходить непосредственно к рассмотрению архитектуры Bcachefs.

Архитектура Bcachefs​

Ядром архитектуры этой файловой системы является дерево B+ с очень высокой производительностью и очень низкой задержкой, которое также можно назвать не совсем обычным деревом B+, а скорее гибридным, из-за сжатия структур данных. То есть, узлы B-tree очень большие, структурированы по журналам и при необходимости могут уплотниться (повторно использоваться) в памяти. Это означает, что наши B+ деревья очень маленькие по сравнению с другими файловыми системами.

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

Борьба с этой задержкой была в центре внимания во всей кодовой базе Bcachefs, так как система не удерживает блокировки дерева B+ при выполнении операций ввода-вывода, а уровень транзакций Btree позволяет легко удалять и восстанавливать блокировки по мере необходимости. Если говорить языком маркетологов, то одна из основных целей Bcachefs - стать первой программной файловой системой общего назначения в реальном времени.

Кроме того, в отличие от других CoW-деревьев, обновления Btree регистрируются в журнале. Это значительно повышает эффективность нашей записи при случайных обновлениях, поскольку это означает, что записи в Btree выполняются только при наличии большого блока обновлений или при необходимости восстановления памяти или журнала.

Для эффективного аннулирования кэшированных данных и повторного использования дискового пространства в Bcachefs реализовано деление диска на сегменты, обычно от 512 КБ до 2 М, но, возможно, больше или меньше. Блоки данных имеют номера генерации: мы можем повторно использовать блок с кэшированными данными, не находя и не удаляя все указатели данных, просто увеличивая номер генерации.

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

В Bcachefs для реализации данного функционала используется копирующий сборщик мусора, который позволяет справиться с внутренней фрагментацией, когда шаблоны случайных записей оставляют нам множество частично пустых корзин (поскольку содержащиеся в них данные были перезаписаны). Копирующий сборщик мусора освобождает ячейки, которые в основном пусты, записывая содержащиеся в них данные в новые ячейки. Это также означает, что нам нужно зарезервировать место на устройстве при форматировании - обычно 8% или 12%.

Опции ввода-вывода​

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

Контрольная сумма bcachefs поддерживает как метаданные, так и контрольную сумму данных - crc32c по умолчанию, но также доступны более точные контрольные суммы. Включение функции контрольной суммы данных приводит к некоторым потерям производительности - помимо вычисления контрольной суммы, записи должны быть восстановлены для обеспечения стабильности контрольной суммы (Linux обычно не может гарантировать что записываемый буфер не изменяется в процессе работы).

Детализация контрольной суммы в Bcachefs осуществляется на уровне отдельных экстентов, что приводит к уменьшению объема метаданных, но означает, что мы должны считывать целые экстенты, чтобы проверить контрольную сумму. По умолчанию контрольная сумма и сжатые экстенты ограничены 64 кбайт. Для большинства приложений и сценариев использования это идеальный вариант, но небольшие случайные или прямые чтения приведут к значительным накладным расходам. В будущем для каждого индекса будет предусмотрена возможность детализации контрольной суммы.

На этом полагаю, описание основного функционала файловой системы можно завершить и перейти к развертыванию. Для этого выполним:

sudo apt-get update

sudo apt-get -y install bcachefs-tools

Далее нам нужен бесхозный раздел, который мы можем отформатировать под данную файловую систему. В моем случае это sdb1.

sudo bcachefs format /dev/sdb1

714d053d77a63f7f66daed7c9c2e38ea.png

Далее подмонтируем новый раздел с помощью опции mount:

sudo bcachefs mount bcachefs /dev/sdb1 /mnt

b2ac59f33165654b57bf2ff7aa79bd1a.png

Вот собственно и все основные опции для работы с файловой системой Bcachefs. Возможны также различные варианты использования совместно с RAID и множественными устройствами.

Из полезных опций стоит также отметить просмотр свободного места на диске с помощью следующей команды:

bcachefs fs usage --human-readable /mnt/bcachefs

83146aa1fad69cd3b8aa8f274f98e057.png

Заключение​

В этой статье мы рассмотрели принципы работы и устройство файловой системы Bcachefs. Эта система позволяет ускорить работу дисковой подсистемы за счет использования быстрых алгоритмов работы.

 
Сверху