Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Файловые системы Linux

Фрагментация под Linux: Настройка файловой системы Ext3

Автор: Oliver Diedrich, перевод: Алексей Дмитриев

Предыдущие страницы: 123.


Списки или деревья

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

С того времени Ext3 научилась управлять директориями при помощи древовидных структур, также как и ее конкуренты ReiserFS, XFS и JFS. Если установлено свойство dir_index, скорость операций в директориях радикально повышается. Падение производительности происходит только если директории заполнены сотнями тысяч файлов. Обычно это вызвано эффектом кэширования - чем меньше основная память, тем раньше наступает снижение производительности. Похоже, что ядро Линукс не использует избытки памяти для кэширования структур директорий - в однопользовательском режиме не наблюдалось повышения производительности при увеличении RAM с 1 до 2 Гб. В обычных операциях с сериями дополнительных процессов, мы, однако, хорошо видели разницу между одним и двумя гигабайтами RAM.

Рисунок 3. В зависимости от количества доступной памяти, скорость Ext3 может снижаться в "густонаселенных" директориях. Мы измеряли заполнение директорий программой readdir() в однопользовательском режиме.

Можно подключить опцию dir_index уже после создания файловой системы при помощи команды:

tune2fs -O dir_index

хотя в этом случае она будет применяться только ко вновь создаваемым директориям. Существующие директории на отмонтированной файловой системе могут быть переведены в режим dir_index при помощи команды

e2fsck -fD

после того, как свойство dir_index будет активировано предыдущей командой. Из соображений надежности, после этой процедуры нужно снова запустить команду e2fsck -f.

Эта опция также полезна, если файлы в директориях постоянно создаются и удаляются. Так как Ext3 не удаляет имена удаленных файлов из файлов директорий (а мы помним, что директория - это тоже тип файла) и они продолжают расти, даже если большинство записей не используется. Команда e2fsck -fD удаляет ненужные записи из файлов директорий и пересоздает дерево имен файлов, что может существенно повысить скорость операций в больших директориях.

Журналирование

Основное отличие Ext3 от Ext2 - это наличие журнала, о котором мы уже упоминали. Его идея проста. Любое изменение в файловой системе, например создание нового файла, отражается во многих местах системы:

  • создается новая запись в директории,

  • создается новый индексный дескриптор,

  • блоки данных и дескриптор помечаются как зарезервированные в битовых картах блоков и дескрипторов,

  • изменяется дата последнего доступа в дескрипторе директории,

  • обновляется статистика файловой системы в суперблоке,

  • и сами данные записываются в соответствующие блоки.

Если во время всех этих операций произойдет отключение питания, либо случится сбой системы, то файловая система станет неполноценной, например будет существовать дескриптор без соответствующей ему записи в директории, что в результате даст безымянный файл в директории lost+found после проверки e2fsck.

Чтобы предотвратить такое развитие событий, Ext3 первым делом записывает изменения в свой журнал. До тех пор пока все перечисленные групповые изменения (транзакция) не войдут в журнал, старые метаданные файловой системы останутся неизменными. Когда транзакция закончится, и новые метаданные будут в журнале, только тогда они могут быть перенесены в файловую систему при первой возможности. Если случается сбой, e2fsck достаточно перенести завершенные транзакции из журнала в файловую систему, чтобы обеспечить целостность и связность системы. Незавершенные транзакции в журнале игнорируются, так как старые метаданные в файловой системе остались в силе.

Ext3 имеет несколько различных режимов работы с журналом. Эти режимы могут быть выбраны во время монтирования при помощи команды:

mount -O data=MODE

По умолчанию устанавливается режим data=ordered, - Ext3 сразу пишет данные на диск, прежде чем измененные метаданные попадут в журнал; в этом случае обеспечивается только целостность метаданных. Если происходит сбой или потеря питания прежде чем завершится транзакция в журнал, то уже записанные на диск данные пропадут, так как вновь занятые блоки не будут связаны со своими дескрипторами и не будут помечены как занятые в битовой карте блоков.

Опция data=journal означает, что сами данные проходят через журнал, но это радикально снижает быстродействие системы, так как все данные приходится записывать на диск дважды.

При выборе опции data=writeback, метаданные в журнале могут быть записаны прежде чем сами данные. Это немного повысит скорость, так как Ext3 в этом случае лучше оптимизирует доступ на запись, однако в случае сбоя, старые данные могут оказаться в якобы вновь созданных файлах, и файлы, которые считались правильно созданными, окажутся пустыми.

Чтобы повысить быстродействие системы, журнал можно разместить на другом диске, отдельно от файловой системы - это позволит осуществлять одновременный доступ к файловой системе и к журналу. Для этого необходимо сначала создать внешний журнал при помощи команды:

mke2fs -O journal_dev DEVICE

а затем запустить команду

mke2fs -J device=DEVICE

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

В результате Ext2 имеет программы восстановления удаленных файлов - команду lsdel - часть набора программ debugfs, и специальные программы восстановления удаленных файлов (undelete)[1]. В Ext3 эти программы не работают.


Последующие части: 56.