Именно этот слоган (с добавлением технологии 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?».

Комментарии (5)


  1. psi_lion
    05.06.2024 22:25
    +5

    Хотя эта файловая система входит в состав ОС Linux уже более десяти лет

    В вики говорят, что ей ещё нет 10 лет, а добавили её в ядро совсем недавно, в 6.7 (вот тут упоминается, что это новая фича ядра).

    А вообще статья похожа на перевод документации из разных мест. Например, часть про архитектуру подозрительно похожа на это, но в самой статье нет ни одной ссылки на первоисточники (ну хотя бы в начале можно было бы вставить ссылку на сайт проекта, если цель статьи обратить на него внимание)


  1. sabirovrinat85
    05.06.2024 22:25
    +6

    хм, и где же самое интересное? тянет на довольно неплохую, но первую часть цикла статей скорее.

    в bcachefs чрезвычайно важным отличительным функционалом является способ организации пулов хранения из многих разнообразных накопителей (там оно отличается от ssd кеша для пулов из жёстких дисков в zfs)

    ещё очень интересным является вопрос возможности так организовать например работу простого массива из двух накопителей, чтобы какая-то область функционировала на уровне схожим с raid0, а другая - raid1, притом это не жёстко зафиксировано по объему (ещё со времён mdadm делать такое фиксированно банально через отдельные разделы можно было, конечно скорее для дома). btrfs например к сожалению так не умеет, хотя возможно, что архитектура позволяет реализовать, zfs тоже не умеет (zpool может только состоять из vdev собранных по разному, это плохая практика). Когда-то пробегал глазами по документации bcachefs и не помню отчего именно, но сложилось впечатление, что тут это возможно (потенциально хотя бы).


    1. kagramanova
      05.06.2024 22:25

      Самое интересное в bcachefs - это его уникальные возможности по организации пулов хранения из различных накопителей. Это сильно отличается от концепции использования SSD как кеша для жестких дисков в ZFS.


  1. juffinhalli
    05.06.2024 22:25
    +3

    Вместо обрывков теории в статье лучше познакомиться с результатами тестов - https://www.phoronix.com/review/bcachefs-benchmarks-linux67


  1. evgensenin
    05.06.2024 22:25
    +1

    btrfs же тоже на B-tree, и CoW есть, и вот это вот все, в чем разница между btrfs и bcachefs?