Btrfs (B-tree File System)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:15, 3 декабря 2016.

Btrfs (англ. B-tree FS, «Better FS» или «Butter FS») — файловая система (ФС) для Linux, основанная на структурах «B-деревьев» и работающая по принципу «копирование при записи» (copy-on-write). Опубликована компанией Oracle Corporation в 2007 году под лицензией GNU General Public License (GPL). Одной из первоначальных целей разработки данной файловой системы было обеспечение достойной конкуренции популярной ZFS. Btrfs будет избавлена от многих недостатков, присущих другим современным файловым системам для Linux[1].

Разработчики системы обозначили основную задачу так — позволить файловой системе масштабироваться под вновь появляющиеся системы хранения. Масштабирование — это не просто возможность адресовать доступное пространство, это возможность управлять файловой системой с помощью простого интерфейса. Это сделает файловую систему более надёжной, и позволит видеть используемые ресурсы.

История создания

Структура ядра данных BTRFS основанная на структурах «B-деревьев» и работающая по принципу «копирование при записи» (copy-on-write) – первоначально была предложена инженером компании IBM Охадом Родехом на презентации USENIX в 2007 году. Крис Мейсон, инженер, работающий на ReiserFS для SUSE на время, присоединился к Oracle в том же году и начал работу над новой файловой системы на основе этих Б-деревьев. В 2008 году главный разработчик ext3 и ext4 файловых систем, Теодор Тсо , заявил, что, хотя ext4 прогрессирует, это не является перспективным решением ; в ней используется старая технологию и это является огромным тормозом. Тз'о сказал , что Btrfs является лучшим направлением , потому что она предлагает улучшения в масштабируемости, надежности и простоты управления». Btrfs также имеетряд тех же дизайнерских идей , которые имели перспективные Reiser3 или Reiser4[2].

Btrfs 1.0, в доработанном формате на диске был,принят в основную ветку ядра Linux в 2009 году Несколько дистрибутивов Linux начали предлагать Btrfs вкачестве экспериментального выбора корня файловой системы во время установки. Летом 2012 года несколько дистрибутивов Linux переехали в Btrfs из экспериментального. В 2015 году Btrfs была принята в качестве файловой системы по умолчанию для SUSE Linux Enterprise Server 12.

Развитие Btrfs началось в 2007 году, а к августу 2014, версия дискового формата файловой системы была отмечена как стабильная.

Принципы устройства

С точки зрения устройства ФС, можно выделить следующие основные моменты, которые делают возможными все перечисленные особенности в сочетании с очень хорошей производительностью:

  • B-деревья везде, где они имеют смысл
  • Copy-on-write везде, где это имеет смысл
  • Политика блокировок - высокая гранулярность блокировок.

B-деревья

B-деревья и дали название файловой системе (B-tree FS). B-деревья - это сильноветвящиеся деревья (B-деревья почему-то часто путают с двоичными деревьями, видимо, из-за буквы B, но она означает Block; у каждого узла в B-дереве обычно несколько тысяч потомков), каждый узел которых, в свою очередь, содержит большое количество записей (они обычно организуются в двоичное сбалансированное дерево; в частности, в Btrfs используются красно-чёрные деревья). Читаются и пишутся узлы B-дерева целиком, что даёт значительный выигрыш в производительности

Copy-on-write

Copy-on-write (CoW) - это алгоритм, предназначенный для ситуаций, когда нужно создавать много похожих объектов. Рассмотрим, например, создание снапшота ФС. Снапшот - это мгновенная копия всех данных части ФС в данный момент времени. Реализация "в лоб" предусматривает создание копий всех файлов, что займёт много времени и много дискового пространства. При использовании CoW создаётся только один новый объект - копия корневого каталога, а на всех файлах, на которые ссылается корневой, ставится специальная метка. Когда приложение пытается писать в "помеченный" каталог, ФС прозрачно для приложения делает его копию (помечая при этом все файлы в этом каталоге), и приложение пишет уже в созданную копию. Таким образом, создаются копии только изменившихся данных, и только тогда, когда данные действительно изменяются. Это позволяет сделать операцию создания снапшотов почти мгновенной даже для очень больших разделов. Это немаловажно, т.к. одно из основных требований к операции создания снапшота - атомарность, т.е. эта операция не должна прерываться (и конфликтовать) никакими другими операциями. В Btrfs CoW используется не только при создании снапшотов, но и при ведении журнала и многих внутренних операциях.

Блокировки

Блокировки - это сущность, позволяющая избежать конфликтов при одновременном доступе к данным из разных потоков. Поток, который хочет внести изменение в некоторую структуру данных, сначала проверяет, не заблокирована ли она другим потоком; если заблокирована - ждёт, пока блокировка не будет освобождена, иначе сам захватывает блокировку, и освобождает её по окончании записи. Когда речь идёт о доступе к сложным структурам данных, возникает вопрос о политике блокировок. Нужно ли блокировать всю структуру целиком, или каждый элемент в отдельности, или элементы какими-то группами? Чем крупнее единица блокировки, тем меньше блокировок, и меньше накладных расходов. Чем мельче - тем более эффективно расходуется процессорное время, т.к. потокам приходится ждать гораздо меньше. Btrfs стремится блокировать как можно меньшие элементы структур (но не слишком мелкие).

Spin-lock и Мьютексы

Ещё один пункт, связанный с блокировками, специфичен для ядра. В ядре есть два вида блокировок: spin-lock и мьютексы. При использовании spin-lock ожидающий поток "крутится" в бесконечном цикле. При использовании мьютексов - поток переходит в заблокированное состояние TASK_INTERRUPTIBLE, и "пробуждается" планировщиком автоматически при освобождении блокировки. Понятно, что мьютексы более эффективны, т.к. не тратят процессорное время на пустые циклы. Но мьютексы не могут быть использованы в контексте обработчика прерывания, т.к. в этом состоянии планировщик не работает. Значительная часть функций любой ФС может быть вызвана как из обработчика прерывания, так и в контексте задачи. Поэтому во многих функциях приходится использовать менее эффективные спин-блокировки.

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

Особенности

Ещё одна особенность Btrfs: все структуры ФС могут находиться в произвольных местах раздела, они связаны между собой указателями. Этой особенностью обладают и некоторые другие ФС, но разработчики Btrfs нашли ей новое применение: конвертация разделов из других ФС (сейчас реализована конвертация из ext2/3, конвертер из ext4 в разработке, теоретически можно создать конвертеры из других ФС). При конвертации структуры Btrfs создаются в местах раздела, помеченных в исходной ФС как свободные. В Btrfs создаётся специальный файл, в который входят блоки, занятые структурами исходной ФС. Таким образом, эти блоки оказываются помеченными как занятые. Кроме того, этот файл представляет собой образ исходной ФС, который можно примонтировать (mount -o loop). Это позволяет выполнить откат к предыдущей ФС. Чтобы освободить место на диске, достаточно просто удалить файл с образом исходной ФС (возможность отката, соответственно, пропадёт).

Одна из особенностей современных ФС не так давно вызвала небольшой скандал. Дело в том, что в ядрах UNIXLinux) код ФС не занимается непосредственно записью данных на диск. Данные записываются в страницы памяти, и эти страницы помечаются как "грязные", и затем их сбрасывает на диск отдельный поток ядра (pdflush). Так вот, при использовании современных ФС (в той новости речь шла про ext4, но теми же свойствами обладают и XFS, и Btrfs, и многие другие) интервал между записью данных в страничный кэш и их записью на диск может достигать 150 секунд (больше двух минут). UNIX традиционно пишется для хорошего оборудования. В частности, предполагается, что в любой системе, от которой нужна надёжность, применяются UPS. Поэтому большая задержка записи является не недостатком, а преимуществом: это даёт возможность разместить данные более удачно, и избежать фрагментации. А при использовании на менее надёжном оборудовании нужно просто перенастроить ядро средствами sysctl, чтобы заставить pdflush срабатывать чаще.

Возможности

Теодор Цо разработчик файловых систем ext3 и ext4, сказал, что Btrfs «имеет несколько решений, присутствующих в ReiserFS/Reiser4»[3]. В настоящее время Btrfs не поддерживает некоторые базовые функции, тем не менее, список текущих (и планируемых) возможностей Btrfs таков:

  • эффективная упаковка мелких файлов и индексированных каталогов;
  • динамическое выделение inode (нет ограничения на максимальное количество файлов в файловой системе);
  • снимки (snapshots) и снимки снимков;
  • различные внутренние корни файловых систем — подтома (subvolumes);
  • объектный уровень зеркалирования и расслоения данных;
  • хеши на данные и метаданные (улучшенная гарантия целостности, текущий алгоритм хешей — CRC-32C, аппаратное ускорение которого реализовано в наборе инструкций SSE 4.2, альтернативные в планах;)
  • прозрачная компрессия (в данный момент доступно zlib (по умолчанию) и lzo, активируется при монтировании с опцией -o compress или -o compress=<тип>);
  • журналирование чтений-записей всех данных и метаданных;
  • сильная интеграция с Device mapper для поддержки многочисленных устройств с несколькими встроенными алгоритмами для работы с RAID;
  • эффективное инкрементальное резервное копирование и зеркалирование файловой системы;
  • миграция с файловой системы ext3 (ext4) и обратно (до момента обновления);
  • режим оптимизированной работы под SSD (активируется при монтировании с опцией -o ssd);
  • дефрагментация в рабочем режиме;
  • дедупликация данных после записи специальными утилитами.

Планируемые возможности: * дедупликация данных во время записи этих данных; * проверка файловой системы в рабочем режиме (online) и очень быстрая проверка в нерабочем режиме (offline).

Несмотря на то, что Btrfs изначально не способна вести себя как распределённая (сетевая) файловая система, компания Oracle принялась за реализацию сетевого протокола файловой системы CRFS, который спроектирован и оптимизирован как раз под Btrfs.

BtrFS vs ZFS

Больше всего Btrfs похожа на ZFS от компании Sun. Btrfs не поддерживает диски такого астрономического объёма, как zfs, но вряд ли это в ближайшее время будет иметь практическое значение. Зато Btrfs имеет некоторые возможности, отсутствующие в zfs: снапшоты снапшотов и скоростные приоритеты дисков, оптимизацию для ssd-накопителей. Но ZFS уже вовсю используется на production-серверах, а использование btrfs станет массовым, видимо, года через два (если предполагать, что распространение btrfs будет развиваться также, как zfs).

Измерения производительности Btrfs сейчас мало информативны, т.к. оптимизация в разгаре. Однако уже сейчас Btrfs обходит zfs по производительности некоторых операций.

Примечания

  1. Приципы устройства BtrFS [Электронный ресурс] / Дата обращения: 31.10.2016. — Режим доступа: http://lna.org.ru/book/export/html/23
  2. История ФС BtrFS [Электронный ресурс] / Дата обращения: 31.10.2016. — Режим доступа: https://en.wikipedia.org/wiki/Btrfs
  3. Btrfs Возможности [Электронный ресурс] / Дата обращения: 31.10.2016. — Режим доступа: https://ru.wikipedia.org/wiki/Btrfs