Библиотека сайта rus-linux.net
Фрагментация под Linux: Настройка файловой системы Ext3
Автор: Oliver Diedrich, перевод: Алексей ДмитриевСписки или деревья
Свойство 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 эти программы не работают.