[ Linux | links | .:.SoundwaveS.:. ]


    Журналируемые файловые системы для Linux.


    Автор: © Ricardo Galli, 28.01.2002.
    Перевод: © Valery V. Kachurov.


    Это - немного модифицированная версия серии статей, опубликованных в Novatica и Upgrade (English, PDF), где мы обьясняем, как использовать все известные журналируемые файловые системы в Linux.
    PS: Статья была написана, когда Ext3 была еще в разработке для включения в стандартное ядро.

    Для начала - в этой области нет ярко выраженных лидеров. XFS лучше в одних случаях, ReiserFS - в других, но все они лучше, чем Ext2, потому что они сравнимы с ней по быстродействию (и снова, в одних случаях они быстрее, а в других - немного медленнее), но, в отличие от Ext2, это - журналируемые файловые системы, и вы уже осведомлены об их преимуществах. И самое важное в этой истории - то, что Linux buffer/cache действительно произвели на меня огромное впечатление. Так что - переходите на журналируемые файловые системы!

    Стандартной файловой системой для 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.
    • Leaves nodes can be linked together.
    • Internal nodes and leaves can be of different sizes.
    • Never needs to change parent if a key in a leaf is deleted.
    • Makes sequential operations easier and cheaper.

    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) Множественные обновления могут быть произведены одной операцией записи в лог. Это увеличивает эффективность ведения лога.
    2) Быстродействие изменения meta-данных обычно делается независимым от скорости устройства, на котором записаны данные. Вообще-то, эта независимость ограничена количеством буферизации, используемой для ведения лога, но все равно - это намного лучше, чем синхронные обновления, используемые в старых файловых системах.

    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.
    2) Для больших директорий. Каждая директория представляется, как B+Tree с ее именем. Это дает возможность быстрого поиска, вставки и удаления директорий.

    JFS поддерживает и "разряженные" и "плотные" файлы. У первого типа файлов данные разбросаны по различным местам, и размер файла - это просто номер самого последнего записанного байта. А физическим расположением самих блоков занимается операция записи.

    Ext3.

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

    Главные преимущества:

    • Ext3 записывает изменения данных и метаданных. Поэтому, в отличии от предыдущих файловых систем, сохраняется и содержимое файлов. Уровень журналирования может контролироваться опцией команды mount.
    • Разделы Ext3 не отличаются от Ext2 на уровне файловой структуры, поэтому можно портировать файлы со старой системы на новую, или делать backup на старую систему.

    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.













[ Linux | links | .:.SoundwaveS.:. ]


 Please send to E-Mail: mara

 Copyright ©    2001 - 2004

 Updated: Втр Ноя 2 19:38:14 EET 2004

Hosted by uCoz