Как стать автором
Обновить
596.18
OTUS
Цифровые навыки от ведущих экспертов

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

Время на прочтение5 мин
Количество просмотров6.8K

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

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

Copy On Write

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

B+ деревья

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

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

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

 

А вот теперь уже можно переходить непосредственно к рассмотрению архитектуры 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

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

sudo bcachefs mount bcachefs /dev/sdb1 /mnt

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

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

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

Заключение

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


Приходите на ближайшие открытые уроки по Linux от Otus: 11 июня — «Управление пакетами в Debian-системах», 17 июня — «Нужен ли swap в Linux?».

Теги:
Хабы:
Всего голосов 16: ↑11 и ↓5+9
Комментарии9

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS