Bcachefs: файловая система, которая не ест ваши данные
Именно этот слоган (с добавлением технологии 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?».