Все метаданные в ZFS— полностью динамические. Нет никаких статических регионов, индексных дескрипторов (inode) и т. п., все подобные структуры выделяются динамически, гак что фактический предел размера и количества файлов, каталогов, файловых систем, мгновенных снимков, клонов и т. д. определяется только объемом доступной дисковой памяти. Соответственно отсутствуют и разные непонятные ограничения, вроде количества inodeв одной группе цилиндров.
При проектировании ZFSбыли учтены уроки масштабирования Solaris, поэтому все операции в ZFSмаксимально параллельны. Можно параллельно считывать и писать один и тот же файл из разных потоков или процессов без нарушения семантики POSIX, иметь множество процессов, создающих и удаляющих файлы в одном каталоге. Все блокировки в ZFSполностью масштабируемы и очень быстры.
Многое, о чем мы говорили, приводит к высокой производительности. Во-первых, копирование при записи и возможность записывать любые данные куда угодно дают возможность превратить случайные операции записи в последовательные, а это шаг к повышению производительности. Динамический размер блока позволяет выбирать его в соответствии с параметрами нагрузки. Планировщик ввода-вывода в ZFSв совокупности с интегрированностью системы обеспечивает огромные возможности планирования, агрегирования и выполнения операций ввода-вывода. При этом учитываются взаимозависимости между операциями, приоритеты и крайние сроки выполнения.
Динамическое чередование помогает наиболее полно реализовать пропускную способность дисков. При статическом чередовании, предусмотренном в RAID-0, используется фиксированное число дисков. В ZFSможно добавить диски в пул, при этом все новые записываемые данные будут распределяться по всем имеющимся дискам, а старые данные, благодаря COW, тоже будут постепенно перераспределены по всем дискам.
Еще один механизм, обеспечивающий высокую производительность ZFS, — интеллектуальная предвыборка. Он не просто работает на уровне блоков, но и учитывает, какой процесс или поток обращается к этим блокам. Если у вас несколько процессов, последовательно читающих разные файлы в разных местах диска, то ZFSсможет это обнаружить и считывать данные, которые понадобятся каждому из процессов, заранее. Традиционные ФС в таких случаях, как правило, сдаются, поскольку считают получающиеся последовательности операций чтения случайными. Более того, ZFSумеет определять размер и шаг операций чтения, что делает ее подходящей для выполнения высокопроизводительных вычислений, обрабатывающих большие массивы данных, которые хранятся в файлах.
В ZFSпредусмотрен эффективный механизм поддержки приложений, нуждающихся в гарантии того, что данные записаны на диск. Он называется ZFSIntentLogили ZILи гарантирует сохранение данных на диске, не теряя преимуществ отложенного сохранения изменений в рамках групп транзакций. Вскоре этот механизм планируется усовершенствовать так, чтобы он позволил использовать для хранения ZILотдельные быстродействующие устройства, например отдельные быстрые или твердотельные диски, а это даст существенный выигрыш в производительности.
Приложение 4. Журналируемые файловые системы для Linux
Стандартной файловой системой для Linuxбыла Ext2. Эта файловая система была разработана WayneDavidsonв сотрудничестве с StephenTweedieи TheodoreTs'o. Это - улучшение предыдущей системы Ext, разработанной RemyCard. Ext2 основана на структуре i-node. I-nodeсодержит информацию о файле и указатели на блоки данных, в которых расположен файл. Для повышения быстродействия операций ввода/вывода данные временно располагаются в оперативной памяти. Проблема возникает, если сбой происходит до того, как данные из кэша перепишутся на диск. Это вызывает несоответствие в файловой системе. Например, возникает ссылка на файл, еще не созданный на диске, или файлы были уже удалены, но их i-nodesи блоки данных остались на диске. Fsck (Filesystemcheck- проверка файловой системы) - стандартная программа для устранения несоответствий. Единственный способ это сделать - просканировать весь диск, и проверить все зависимости между i-nodes, блоками данных и содержанием директорий. С увеличением объемов дисков эта процедура стала занимать огромное количество времени - серьезная проблема для серверов, которые должны работать постоянно.
Это и стало главной причиной внедрения в файловые системы технологии транзакций, взятой из баз данных, и технологии восстановления, что привело к появлению журналируемых файловых систем.
Журналируемая файловая система - это устойчивая к сбоям файловая система, в которой целостность данных гарантирована, потому что обновления meta-данных записываются в лог на диске перед любыми изменениями в структуре файловой системы. В случае сбоя журналируемая файловая система гарантирует восстановление всех потерянных данных. Самый распространенный подход - это метод журналирования или логгирования meta- данных файлов. Его суть в том, что информация о любом изменении записывается в зарезервированную область файловой системы, и только после этого совершается само изменение.
Самые ранние журналируемые файловые системы, созданные в середине 80-х, включали в себя Veritas (VxFS), Tolerant, и IBMJFS. С увеличением спроса на поддержку файловыми системами терабайтных данных, миллионов файлов и 64-битной архитектуры интерес к журналируемым FSдля Linuxвозрос за последние годы.
Linuxимеет четыре новых журналируемых FS- это ReiserFSот Namesys, XFSот SGI, JFSот IBM, и Ext3, разработанная StephenTweedie, учавствовавшим в создании Ext2.
Если ReiserFS- это полностью новая файловая система, написанная с нуля, то XFS, JFSи Ext3 появились из коммерческих продуктов или уже существующих файловых систем. XFSбазирована на системе, разработанной SGI. JFSбыла спроектирована и разработана ГВМ для OS/2 Warp.
ReiserFS- единственная журналируемая FS, включенная в стандартное ядро Linux, а другие только собираются быть включенными в ядро версии 2.5. Но все равно - все они являются полнофункциональными, и выпущены, как официальные патчи к ядру Linux.
Ext3 - это расширение для Ext2. Она добавляет два независимых модуля - для транзакций и ведения логов. Ext3 уже близка к финальной версии, и она уже включена в дистрибутив RedHat7.2.
ReiserFSбазируется на В+Treeв организации объектов файловой системы. Объекты файловой системы - это структуры, используемые для хранения информации о файле - время последнего изменения, права доступа, etc. (Другими словами - вся информация, содержащаяся в i-nodeдиректорий и файлов). ReiserFS называетэтиобъекты"stat data'"', "directory items" и"direct/indirect items". ReiserFSпредоставляет только журналирование meta-данных. В случае незапланированной перезагрузки данные в блоках, используемых во время сбоя, могут быть повреждены, так что ReiserFSне гарантирует того, что после сбоя данные останутся неповрежденными.
Unformattednodes- это логические блоки без определенного формата, используемые для хранения файловых данных, и directitemsсостоят из самих файловых данных. Блоки с самими данными могут быть различных размеров. Одна из специальных возможностей ReiserFS- это TailPacking. Tail- это файл, размер которого меньше, чем логический блок, или какие-то части файлов, занимающие меньше, чем один блок. Для сохранения свободного места ReiserFSиспользует сжатие tail-файлов, и это позволяет примерно на 5% увеличить свободное место по сравнению с Ext2. ТаЛ-файлы могут быть интегрированы в В- Тгее, и поэтому быстродействие ReiserFSпри работе с очень маленькими файлами намного выше.
Проблема в том, что использование этой технологии соединения tail-файлов вместе увеличивает фрагментацию данных. Даже больше, задача запаковывания tail-файлов отнимает время и ведет к потерям в быстродействии. Это - следствие сдвигов памяти, происходящих, когда кто-нибудь добавляет данные к файлу. В Namesysпризнали реальность этой проблемы и позволили администратору системы отключить tailpackingс помощью опции notail.
ReiserFSиспользует фиксированный размер блоков (4 Kb), и это отрицательно влияет на быстродействие операций ввода-вывода при работе с большими файлами. Другая слабость ReiserFS- работа с сильно фрагментированными файлами производится значительно медленнее по сравнению с Ext2, так что Namesysработает над оптимизацией этого процесса.
1 мая 2001 года SGIвыпустила первый релиз своей журналируемой файловой системы для Linux. Особенности XFS- поддержка больших дисков и очень высокая скорость ввода- вывода (на тестировании доходило до 7 Gbв секунду). XFSбыла разработана для операционной системы IRIX5.3 SGIUnix, и первая версия этой файловой системы была представлена в декабре 1994 года. Цель этой файловой системы - поддержка очень больших файлов и высокая пропускная способность для проигрывания и записи видео в реальном времени.
Для увеличения масштабируемости файловой системы XFSобширно использует B+Trees. Они используются для пометки свободных расширителей (extents), индексации директорий и для контроля за динамически размещаемыми i-nodes, разбросанными по всей файловой системе. В дополнение ко всему этому XFSиспользует асинхронную схему логгирования с журналированием (для защиты meta-данных от сбоев после обновления), и позволяет быстро восстановить файловую систему.
XFSиспользует систему распределения места, основанную на расширителях, и имеет такие возможности, как delayedallocation, spaceрге-allocationи spacecoalescingondeletion. Данные располагаются с использованием самых больших расширителей из имеющихся, и это позволяет записывать файлы огромной длины. Чтобы сделать управление огромными количествами непрерывных фрагментов эффективным, XFSиспользует очень большие описания для расширителей. Каждое описание может включать в себя информацию о блоках файловой системы в количестве до 2 миллионов. Описание больших количеств блоков разгружает процессор от такой работы, как поиск записей в extentmap. чтобы определить, являются ли блоки непрерывными. Теперь можно просто прочитать длину всего расширителя, который уже является непрерывным, а не смотреть на каждую запись, определяя, является ли она продолжением предыдущей записи.