Ну... это блог, что ещё ожидать от блога?

четверг, 10 июня 2010 г.

Файловая система Ext4 для Linux: часть 3

Эта заметка «Файловая система Ext4 для Linux: часть 3» продолжение первой части о жёстких дисках, и второй части о терминах ФС и файловой системе Ext4fs. Здесь я выбрал некоторые части из статьи Андрея Пешеходова (filesystems@nm.ru) — «Не новое, но хорошо доработанное старое: взгляд на ext4» о том что нового можно на сегодняшний день обнаружить в Ext4.

Что нового в ext4

16 терабайтный лимит размера раздела в ext3/2 обусловлен 32 битным номером блока и ограничен количеством групп блоков в файловой системе. Решение проблемы – введение 48 битных номеров блоков и ипользование метагрупп в ext4. При этом в ФС создаётся несколько метагрупп, каждая из которых является кластером такого количества групп блоков, дескрипторы которых могут храниться в одном блоке ФС. В 4 килобайтном блоке помещается 64 дескриптора нового формата, т. е. одна метагруппа может адресовать до 8 Gb дискового пространства. Резервные копии дескрипторов хранятся во второй и последней группе блоков каждой метагруппы. Все эти меры позволяют адресовать с помощью групп блоков 1 Eb дискового пространства и теперь поддерживаются разделы размером до 1 экзабайт при 4 килобайтном блоке.


В файловой системе ext3/2 размер файла ограничен 32-битным полем i_blocks в inode, содержащем количество физических блоков (512 байт), занимаемых файлом. В итоге, максимальный размер файла в ext3/2 ограничен величиной 2^32 * 512 = 2Tb, что для ФС нового поколения недостаточно. В ext4 эта проблема решена достаточно прямолинейно и бесхитростно: разрядность поля i_blocks увеличена до 48 бит, размер теперь исчисляется в логических блоках. В итоге размер файла ext4 ограничен только 32-битным номером логического блока в текущем формате экстента и составляет 16 Tb.


Объем каталога ext3/2 ограничен величиной в 32 000 файлов. В ext4 этот лимит полностью устранен – то есть количество файлов в одном каталоге там не ограничено. Для поддержки больших каталогов в ext4, вместо односвязного списка, используется схема индексирования их элементов с помощью так называемых HTree-структур – своего рода B-деревьев постоянной глубины, индексирующих элементы директории по 32-битному хэшу имени. Для каталогов, содержащих более 10 000 файлов, производительность поиска имени возросла в 50-100 раз относительно ext3/2 .


Файловая система ext3/2 отслеживает блоки данных файлов и каталогов с помощью косвенно-блочной схемы. Этот подход достаточно эффективен для сильно фрагментированных или маленьких файлов, но очень накладен для больших хорошо упакованных файлов – особенно на операциях удаления/усечения.

Для решения этого реализованы экстенты. Экстентом называется дескриптор, определяющий участок в несколько непрерывно расположенных дисковых блоков. В ext4 экстент может адресовать до 128 MiB дискового пространства при 4 KiB блоке. 4 экстента могут храниться прямо в inode – их вполне достаточно для небольших или нефрагментированных файлов. Когда встроенных экстентов не хватает, для адресации блоков файла используется дерево экстентов постоянной глубины. Корень этого дерева хранится в inode, сами экстенты – в листьях.


Ext3 поддерживает inodes различного размера, задаваемого во время mke2fs параметром -I [inodes_size]. В ext4 минимальный размер inode увеличен вдвое – до 256 байт. Для сохранения совместимости с кодом драйвера ext3 и e2fsck размеченная часть inode имеет старый формат. В дополнительной секции расположены несколько новых полей (к примеру, наносекундные временные штампы) и динамическая область, используемая под расширенные атрибуты (extended attributes, EAs). Размер дополнительной секции может меняться от версии к версии и хранится в поле i_extra_isize, следующем сразу за старой 128 битной частью. Суперблок содержит 2 связанных с этим вопросом поля: s_min_extra_size (гарантированный размер дополнительной статической области) и s_want_extra_size (желаемый некоей версией, но не гарантируемый размер экстра-области). Оставшееся пространство в inode может быть использовано для хранения встроенных расширенных атрибутов прямо в inode, что существенно увеличивает производительность их обработки. Также попрежнему доступен дополнительный EA блок, позволяющий хранить еще 4 Kb атрибут­данных для каждого файла. Возможность хранения большего количества EAs в форме регулярного каталога не реализована.


В ext4 предразмещение реализовано вполне традиционно – неинициализированный экстент имеет специальную пометку, обнаружив которую при попытке чтения экстента, файловая система вернет приложению блок нулей. При записи в середину такого экстента он разбивается на две части – одна дополняется нулями и пишется на диск, другая остается "виртуальной". В настоящее время все файловые системы Linux, располагающие соответствующим функционалом, принимают запросы на предразмещение через ioctl(). В будущем (по скольку таких ФС становится все больше) планируется введение специального системного вызова, реализующего posix_fallocate API.


Отложенное размещение – хорошо известная техника, суть которой заключается в отсрочке выделения аллокатором ФС блоков до времени сброса страниц (flush). Это позволяет обеспечить более эффективную, сточки зрения фрагментации и нагрузки на CPU, группировку запросов на размещение. Короткоживущие временные файлы при этом могут вообще не получить дискового воплощение, оставаясь лишь в кэше. С появлением отложенного размещения стало возможно реализовать т.н. многоблочное размещение, при котором дисковое пространство выделяется сразу целыми экстентами, что исключает множество лишних вызовов ext4_get_blocks() и ext4_new_blocks() и уменьшает нагрузку на процессор. Многоблочное размещение в ext4 реализовано через сбор информации о свободных экстентах в каждой группе блоков при монтировании ФС и организации ее хэширования в оперативной памяти. Цена этого решения – увеличение времени монтирования ФС.

Комментариев нет:

Отправить комментарий