Журналируемые файловые системы для Linux.
Это
- немного модифицированная версия серии статей, опубликованных в
Novatica и Upgrade (English, PDF), где мы обьясняем, как использовать
все известные журналируемые файловые системы в Linux. Стандартной файловой системой для Linux была Ext2. Эта файловая система была разработана Wayne Davidson в сотрудничестве с Stephen Tweedie и Theodore Ts'o. Это - улучшение предыдущей системы Ext, разработанной Remy Card. Ext2 основана на структуре i-node. I-node содержит информацию о файле и указатели на блоки данных, в которых расположен файл. Для повышения быстродействия операций ввода/вывода данные временно располагаются в оперативной памяти. Проблема возникает, если сбой происходит до того, как данные из кэша перепишутся на диск. Это вызывает несоответствие в файловой системе. Например, возникает ссылка на файл, еще не созданный на диске, или файлы были уже удалены, но их i-nodes и блоки данных остались на диске. Fsck (File system check - проверка файловой системы) - стандартная программа для устранения несоответствий. Единственный способ это сделать - просканировать весь диск, и проверить все зависимости между i-nodes, блоками данных и содержанием директорий. С увеличением обьемов дисков эта процедура стала занимать огромное количество времени - серьезная проблема для серверов, которые должны работать постоянно. Это и стало главной причиной внедрения в файловые системы технологии транзакций, взятой из баз данных, и технологии восстановления, что привело к появлению журналируемых файловых систем. Журналируемая файловая система - это устойчивая к сбоям файловая система, в которой целостность данных гарантирована, потому что обновления meta-данных записываются в лог на диске перед любыми изменениями в структуре файловой системы. В случае сбоя журналируемая файловая система гарантирует восстановление всех потерянных данных. Самый распространенный подход - это метод журналирования или логгирования meta-данных файлов. Его суть в том, что информация о любом изменении записывается в зарезервированную область файловой системы, и только после этого совершается само изменение. Самые ранние журналируемые файловые системы, созданные в середине 80-х, включали в себя Veritas (VxFS), Tolerant, и IBM JFS. С увеличением спроса на поддержку файловыми системами терабайтных данных, миллионов файлов и 64-битной архитектуры интерес к журналируемым FS для Linux возрос за последние годы. Linux имеет четыре новых журналируемых FS - это ReiserFS от Namesys, XFS от SGI, JFS от IBM, и Ext3, разработанная Stephen Tweedie, учавствовавшим в создании Ext2. Если ReiserFS - это полностью новая файловая система, написанная с нуля, то XFS, JFS и Ext3 появились из коммерческих продуктов или уже существующих файловых систем. XFS базирована на системе, разработанной SGI. JFS была спроектирована и разработана IBM для OS/2 Warp. ReiserFS - единственная журналируемая FS, включенная в стандартное ядро Linux, а другие только собираются быть включенными в ядро версии 2.5. Но все равно - все они являются полнофункциональными, и выпущены, как официальные патчи к ядру Linux. Ext3 - это расширение для Ext2. Она добавляет два независимых модуля - для транзакций и ведения логов. Ext3 уже близка к финальной версии, и она уже включена в дистрибутив RedHat 7.2. B-Trees. Самый простой инструмент для улучшенного по сравнению с традиционными Unix-системами быстродействия - это избежание использования связанных списков или bitmaps, которые содержат в себе проблему масштабируемости и неприменимы для новых дисков с огромной вместимостью. Все новые системы используют Balanced Trees (B-Trees), или их вариацию (B+Trees). Balanced Trees - хорошо изученная структура, она более надежна в быстродействии, но алгоритмы управления и балансирования стали более сложными. Структура B+Tree использовалась в индексирующих структурах баз данных долгое время. Эта структура обеспечивала базы данных расширяемым и быстрым механизмом для доступа к записям. Знак "+" обозначает, что это - модифицированная версия оригинала, которая обладает следующими возможностями: • Place all keys at the leaves. ReiserFS. ReiserFS базируется на B+Tree в организации обьектов файловой системы. Обьекты файловой системы - это структуры, используемые для хранения информации о файле - время последнего изменения, права доступа, etc. (Другими словами - вся информация, содержащаяся в i-node директорий и файлов). ReiserFS называет эти обьекты "stat data"", "directory items" и "direct/indirect items". ReiserFS предоставляет только журналирование meta-данных. В случае незапланированной перезагрузки данные в блоках, используемых во время сбоя, могут быть повреждены, так что ReiserFS не гарантирует того, что после сбоя данные останутся неповрежденными. Unformatted nodes - это логические блоки без определенного формата, используемые для хранения файловых данных, и direct items состоят из самих файловых данных. Блоки с самими данными могут быть различных размеров. Одна из специальных возможностей ReiserFS - это Tail Packing. Tail - это файл, размер которого меньше, чем логический блок, или какие-то части файлов, занимающие меньше, чем один блок. Для сохранения свободного места ReiserFS использует сжатие tail-файлов, и это позволяет примерно на 5% увеличить свободное место по сравнению с Ext2. Tail-файлы могут быть интегрированы в B-Tree, и поэтому быстродействие ReiserFS при работе с очень маленькими файлами намного выше. Проблема в том, что использование этой технологии соединения tail-файлов вместе увеличивает фрагментацию данных. Даже больше, задача запаковывания tail-файлов отнимает время и ведет к потерям в быстродействии. Это - следствие сдвигов памяти, происходящих, когда кто-нибудь добавляет данные к файлу. В Namesys признали реальность этой проблемы и позволили администратору системы отключить tail packing с помощью опции notail. ReiserFS использует фиксированный размер блоков (4 Kb), и это отрицательно влияет на быстродействие операций ввода-вывода при работе с большими файлами. Другая слабость ReiserFS - работа с сильно фрагментированными файлами производится значительно медленнее по сравнению с Ext2, так что Namesys работает над оптимизацией этого процесса. XFS. 1 мая 2001 года SGI выпустила первый релиз своей журналируемой файловой системы для Linux. Особенности XFS - поддержка больших дисков и очень высокая скорость ввода-вывода (на тестировании доходило до 7 Gb в секунду). XFS была разработана для операционной системы IRIX 5.3 SGI Unix, и первая версия этой файловой системы была представлена в декабре 1994 года. Цель этой файловой системы - поддержка очень больших файлов и высокая пропускная способность для проигрывания и записи видео в реальном времени. Для увеличения масштабируемости файловой системы XFS обширно использует B+Trees. Они используются для пометки свободных расширителей (extents), индексации директорий и для контроля за динамически размещаемыми i-nodes, разбросанными по всей файловой системе. В дополнение ко всему этому XFS использует асинхронную схему логгирования с журналированием (для защиты meta-данных от сбоев после обновления), и позволяет быстро восстановить файловую систему. XFS использует систему распределения места, основанную на расширителях, и имеет такие возможности, как delayed allocation, space pre-allocation и space coalescing on deletion. Данные располагаются с использованием самых больших расширителей из имеющихся, и это позволяет записывать файлы огромной длины. Чтобы сделать управление огромными количествами непрерывных фрагментов эффективным, XFS использует очень большие описания для расширителей. Каждое описание может включать в себя информацию о блоках файловой системы в количестве до 2 миллионов. Описание больших количеств блоков разгружает процессор от такой работы, как поиск записей в extent map, чтобы определить, являются ли блоки непрерывными. Теперь можно просто прочитать длину всего расширителя, который уже является непрерывным, а не смотреть на каждую запись, определяя, является ли она продолжением предыдущей записи. XFS позволяет использовать различные размеры блоков - от 512 байт до 64 килобайт. Изменение размеров блоков может повлиять на фрагментацию. Файловые системы с большим количеством маленьких файлов обычно используют маленькие размеры блоков, чтобы избежать лишних трат свободного места в случаях, когда размер файла меньше, чем размер блока, а системы с большими файлами обычно делают противоположный выбор и используют большие размеры блоков, чтобы уменьшить фрагментацию файловой системы. XFS - это комплексная разработка, основанная на IRIX, и она очень связана с IRIX, поэтому при портировании на Linux все было полностью переработано и написано с нуля. Результат - модуль pagebuf для Linux, обеспечивающий интерфейс между XFS и подсистемой виртуальной памяти, а так же между XFS и Linux block device layer. XFS поддерживает ACL'ы (с помощью интеграции с сервером Samba), и transactional quotes. В Linux она поддерживает квотирование для группы, в отличии от IRIX квотирования для проекта, потому что именно так квотирование реализуется в файловых системах для Linux. (В Linux нет концепции, эквивалентной "проектам" в IRIX). Более необычные функции XFS из оригинальной версии для IRIX, позволяющие оказывать специальные сервисы различным приложениям (например, обслуживание video в реальном времени) еще не были перенесены в Linux-версию. Нормальный режим работы для XFS - это использование асинхронно ведущегося логгирования. Из-за этого XFS приобретает 2 вещи: 1) Множественные обновления могут быть произведены одной операцией записи в лог. Это увеличивает эффективность ведения лога. XFS также имеет большое количество инструментов для dump'инга, восстановления, наращивания, использования ACL'ов и дисковых квот, и т.д. JFS. IBM в первый раз представила свою собственную журналируемую файловую систему для Unix в выпуске AIX версии 3.1. Сейчас они предлагают более новую файловую систему для AIX-систем, названную JFS2, которая доступна в AIX версии 5.0 и выше. Открытый вариант JFS сейчас отличается от того, который сейчас распространяется с OS/2 Warp Server'ом. JFS отличается высокой пропускной способностью и надежностью, удовлетворяющей требованиям серверов. В этой файловой системе используется адресная структура, базированная на расширениях (extent-based), и расположение блоков в кластерах, что позволяет создавать компактные, эффективные и масштабируемые структуры расположения файлов. Расширение - это несколько последовательно идущих блоков, относящихся к файлу, описываемых тремя параметрами - логическое удаление (offset), длина и физические параметры. Структура адресации - это B+Tree с описаниями расширений, расположенными в i-node. JFS ведет логи, в которых записывается информация об операциях над метаданными. Формат лога устанавливается утилитой создания файловой системы. Особенность логов JFS в том, что когда операция изменения метаданных файловой системы возвращает успешный результат, эффекты этой операции уже записаны, и они останутся в логах даже тогда, когда сбой происходит сразу же после выполнения операции. JFS поддерживает блоки размера 512, 1024, 2048 и 4096 байт. Небольшая величина блока уменьшает фрагментацию, но может увеличивать длину пути, потому что перераспределение блоков может происходить более часто, чем если бы были использованы большие блоки. Поэтому стандартный размер - 4096 байт. JFS динамически распределяет место для i-nodes, и освобождает место, когда они больше не нужны. Эта файловая система поддерживает две различные организации директорий: 1) Используется для маленьких директорий. Оглавление директории хранится в ее i-node. JFS поддерживает и "разряженные" и "плотные" файлы. У первого типа файлов данные разбросаны по различным местам, и размер файла - это просто номер самого последнего записанного байта. А физическим расположением самих блоков занимается операция записи. Ext3. Вообще-то, это Ext2 с файлом журнала. Ext3 - это всего лишь половина настоящей журналируемой системы, надстройка над Ext2. С одной стороны, она позволяет вести лог операций для более быстрого восстановления. Но эта файловая система унаследовала некоторые ограничения от Ext2 (например, она базируется на блоках и использует полный перебор при поиске файлов и директорий), и поэтому ее нельзя назвать чистой журналируемой файловой системой. Главные преимущества: • Ext3 записывает изменения данных и метаданных. Поэтому, в отличии
от предыдущих файловых систем, сохраняется и содержимое файлов. Уровень
журналирования может контролироваться опцией команды mount. Ext3 резервирует одну из специальных Ext2 i-nodes для хранения логов, но сам журнал может быть на любой i-node в любой файловой системе. Возможно иметь несколько файловых систем Ext3 с совместным журналом. Работа файла журналирования - записывать состояние системных метаданных во время процесса совершения транзакций. В журнал пишется состояние трех типов данных: метаданные, блоки описания и Header блоки. Журналируемый блок метаданных всегда записывается полностью, даже если в файловой системе произошло очень маленькое изменение. Это делается относительно быстро, потому что журналируемые операции ввода/вывода могут быть обьединены в большие кластеры и блоки могут быть записаны прямо из кэша с помощью использования структуры buffer_head. Блоки описания описывают другие блоки метаданных, так что механизм восстановления может копировать метаданные назад в файловую систему. Они записываются перед изменением журнала метаданных. Header блоки описывают заголовок, окончание журнала, и порядок номеров - для того, чтобы гарантировать упорядоченную запись во время восстановления. Сравнение быстродействия и выводы: Различные тесты показали, что XFS и ReiserFS имеют очень хорошее быстродействие по сравнению с многократно тестированной и оптимизированной Ext2. Ext3 работает медленнее, но приближается к Ext2. (Ожидается, что ее быстродействие будет улучшаться). JFS показала самые плохие результаты не только в быстродействии, но и в стабильности. XFS, ReiserFS и Ext3 доказали, что они - быстрые и надежные файловые системы. XFS имеет более высокое быстродействие в такой важной области, как работа с большими файлами. Сейчас ReiserFS полностью перечитывает дерево при записи каждого 4KB блока, и вставляет по одному указателю одновременно, и поэтому происходит повышение затрат на балансирование дерева. При операциях с маленькими файлами, обычно между 100 и 10000 байт, ReiserFS показала лучшие результаты в том случае, когда эти файлы еще не находятся в кэше. А при чтении файлов из кэша разница почти незаметна для Ext2, Ext3, ReiserFS и XFS. Среди всех файловых систем только ReiserFS была включена в ядро Linux, начиная с версии 2.4.1, и SuSE поддерживает ее уже более 2 лет. Ext3 собирается быть стандартной файловой системой для Red Hat, а XFS используется на больших серверах, особенно в Голливуде, потому что там большое влияние имеет SGI. А IBM нужно вложить много усилий в JFS, если они хотят сделать ее распространенной файловой системой, и альтернативой для перехода c AIX и OS/2 на Linux. Ссылки: Ext3 architecture, Introduction to Linux Journal File Systems, XFS Home Page, JFS Home Page, ReiserFS Home Page, Storage Foundry, OS News. Тесты: Ext2, Ext3, ReiserFS, XFS and JFS benchmarks, Ext2, ReiserFS and XFS Benchmarks, Pruebas con XFS, ReiserFS, Ext2FS, y FAT32, Namesys benchmarks, Ext2, XFS, ReiserFS and JFS Mongo Benchmarks. |