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

UnixForum






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

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

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

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

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

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


Фрагментация

Если вы спросите приверженца Линукс о программе дефрагментации, обычным ответом будет: "Она не нужна", или: "Ext3 не фрагментирует", или: "Только Windows требует дефрагментации". Но фрагментация затрагивает в той или иной степени все файловые системы.

Рассматривая вопрос о фрагментации в Ext3, необходимо различать два весьма различных понятия: внутренняя фрагментация, о которой мы уже упоминали, и внешняя фрагментация. Последняя относится к файлам, чьи блоки данных не следуют непрерывной чередой друг за другом, но разбросаны по всему диску. В результате считывающие головки тратят больше времени на доступ для чтения и записи. Внутренняя фрагментация "только" транжирит дисковое пространство, тогда как внешняя снижает быстродействие системы.

Ext3 весьма успешно справляется с внешней фрагментацией и минимизирует перемещения считывающих головок - например пытается заготовить сектор из восьми последовательно идущих блоков для вновь создаваемых файлов. Кэширование записи также обеспечивает запись на диск "в один проход" тех данных, которые приложение записывало кусками, что гарантирует непрерывную область на диске. Конечно, кэширование записи не помогает, когда файлы растут медленно, например директории, которые заполняются от случая к случаю. Фрагментация также неизбежна в файлах различного размера, постоянно создаваемых и удаляемых, что приводит к появлению брешей из пустых блоков.

Борьба с фрагментацией накладывается на еще одну оптимизирующую стратегию - локализацию данных и метаданных, которую пытаются достичь при помощи групп блоков. Из-за того, что Ext3 пытается сохранить файлы одной директории в одной группе блоков, в ней возникает фрагментация, хотя рядом на диске может находиться большая непрерывная свободная область. Утверждение, что Ext3 начинает фрагментировать только при заполнении файловой системы на 80-90% не всегда верно. В зависимости от стиля работы, файловая система может быть фрагментирована и при изобилии свободного места.

Так, например, мы обнаружили сильно фрагментированные свободные области на интенсивно работающем IMAP сервере, сохраняющий все письма в индивидуальных файлах, несмотря на то, что более 900Гб дискового пространства на 1,4Тб диске было свободно.

Рисунок 4. На почтовом сервере IMAP, который сохраняет каждое письмо в индивидуальном файле, свободные зоны во многих группах блоков сильно фрагментированы.

Проверка

Степень фрагментации можно проверить программой dumpe2fs, которая, будучи запущена без опций, выведет фрагментацию свободного пространства для каждой группы блоков. В идеале должна существовать одна непрерывная зона свободных блоков в каждой группе блоков; чем меньше зона свободных блоков, тем больше вероятность расщепления вновь создаваемых файлов на несколько фрагментов. В худшем случае, по всей группе блоков разбросаны отдельные свободные блоки. Можно осторожно использовать программу dumpe2fs на примонтированной файловой системе, хотя это может дать противоречивые результаты - первоначальные статистические сводки для каждой группы блоков, например, могут показывать иное количество блоков, чем результирующий список индивидуальных блоков.

Так как вывод программы dumpe2fs может стать весьма обескураживающим с сотнями и тысячами групп блоков, то мы создали скрипт на языке perl: eval_dumpe2fs perl script[2], который читает вывод dumpe2fs и выдает суммарную сводку статистики.

Скрипт определяет для каждой группы блоков, сколько свободных блоков объединены в зоны минимум по два блока ("ломти" - chunks), а сколько индивидуальных блоков, и вычисляет средний размер этих ломтей ("avg. chunk size"). Критические значения выделяются полужирным шрифтом. Суммарная статистическая сводка показывает, сколько групп блоков фрагментированы и в какой степени.

Программа dumpe2fs также показывает, сколько дескрипторов остаются незанятыми в каждой группе блоков. Если группа блоков содержит множество мелких файлов, все дескрипторы могут быть израсходованы раньше, чем закончатся свободные блоки. Хотя такая ситуация не влияет поначалу на быстродействие, если слишком много групп блоков останутся без дескрипторов, то Ext3 не сможет больше гарантировать местонахождение данных и метаданных. А если в файловой системе закончатся все дескрипторы, то она не сможет больше создавать файлы, несмотря на обилие свободных блоков.

Измерение

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

После проверки файловой системы, e2fsck выдает процент несмежных файлов. Для правильно отмонтированной файловой системы, проверку усиливают опцией -f. Даже при заполненной файловой системе, этот процент поразительно мал - обычно выражается однозначным числом. Причина в том, что e2fsck считает среди прочих и файлы, вовсе не содержащие блоков данных, такие как: пустые файлы, файлы символических ссылок, файлы устройств. Кроме того, типичная Линукс система содержит множество файлов, меньших 4Кб, то есть занимающих один блок (если размер блока 4Кб), тут нечего фрагментировать. Даже при максимальной фрагментации, количество фрагментированных файлов не может превысить общего количества файлов, занимающих больше одного блока.

Наша программа ext2_frag[3] использует другой подход, и не учитывает пустые файлы и файлы устройств. Она группирует файлы в несколько классов, в соответствии с количеством занимаемых ими блоков. Статистическая сводка этой программы показывает процент фрагментации среди файлов, занимающих больше одного блока, и этот процент обычно в два-три раза выше того, что выдает e2fsck, считающая все файлы.

Вообще говоря, подсчет количества фрагментированных файлов, не говорит ничего о степени фрагментации файла - просто различаются фрагментированные и нефрагментированные файлы. Поэтому программа ext2_frag подсчитывает количество фрагментов на один файл для каждого класса файлов.

Общая фрагментация станет особенно наглядной, если соотнести количество несмежных блоков с количеством потенциальных перемещений головок диска. Чтобы его вычислить, нужно: для каждого файла, из количества блоков вычесть единицу (n_blocks-1). Эта цифра и будет теоретическим максимумом перемещений головок диска. В самом деле, если в файле всего два блока, то возможно лишь одно перемещение - между блоком 1 и блоком 2, и так далее. Теперь возьмем общее число несмежных блоков и разделим его на теоретический максимум перемещений головок (суммированный по всем файлам). Получим число от 0 до 1, а если умножить его на 100, то получим некий процент - Индекс Фрагментации, как он называется в программе ext2_frag (fragmentation index). Здесь есть одна натяжка, или особенность: Если каждый файл состоит из одного блока, то несмежных блоков нет вообще, так что и число реальных, и число максимально возможных перемещений головок равно нулю. На ноль делить нельзя, но мы принимаем в этом случае 0/0 = 0. Нулевое значение Индекса Фрагментации означает, что все файлы сохранены в одном месте, а значение 100 означает максимальную фрагментацию.

Рисунок 5. На персональных рабочих станциях фрагментация весьма незначительна.


В пакете e2fsprogs имеется также программа filefrag, подсчитывающая, на сколько фрагментов разбит файл. Программа также сообщает минимальное число фрагментов, необходимое для размещения файла (файлы длиннее 128Мб не влезут в одну группу блоков, и вынужденно должны быть разбиты на фрагменты).

Немного менее удобной является программа fragments[4], которая просматривает целые директории и может работать с древовидной структурой, используя опцию -r. Программа выдает как статистическую сводку по директории (опция -d), так и сведения о фрагментации отдельного файла (опция -f).

В то время как программа ext2_frag осуществляет доступ к файловой системе на низком уровне, и анализирует содержимое каждого дескриптора, чтобы подсчитать занятые блоки, программы filefrag и fragments используют специальную программу ioctl, которая определяет блоки данных, занятые данным файлом. Программа ioctl может работать только с обычными файлами, а не с директориями. Поэтому результаты этих программ для одной и той же файловой системы могут слегка различаться. Смотрите Приложение Измерение фрагментации для более подробного ознакомления.

Дефрагментация

Фрагментация снижает быстродействие ввода/вывода, так как операции считывания и записи замедляются излишними передвижениями головок дисков. Однако для многих приложений это не слишком важно, в большинстве случаев доступ к диску имеют сразу несколько приложений, что приводит к одновременной обработке нескольких файлов. Линукс минимизирует перемещения головок, так организуя доступ на чтение и запись, что большинство файлов обрабатываются из кэша. Благодаря опережающему считыванию (readahead) файлов, данные зачастую бывают прочитаны прежде, чем приложение запросит их.

Однако, при интенсивном вводе/выводе, например при постоянной записи и считывании большого количества данных, влияние фрагментации на производительность системы может стать вполне заметным. Мы экспериментировали с нашим Cyrus IMAP сервером, обрабатывающим интенсивный почтовый трафик, и сохраняющим каждое письмо в отдельном файле. Несмотря на обилие свободного места, четверть всех файлов, превышающих один блок, были фрагментированы. В том числе небольшие файлы, длиною меньше 48Кб, использующие прямую адресацию блоков (см. таблицу) В таких случаях очень возможно, что дефрагментация улучшит ситуацию.

number of blocks

files

fragmented

percent

fragments/file

1

5722303

0

0.00

1.00

<= 12

3492714

761372

21.80

1.37

<= 524

513126

154964

30.20

9.30

<= 1036

26247

9233

35.18

64.78

<= 4108

21673

9670

44.62

148.23

> 4108

2462

1518

61.66

380.00

all files

9778525

936757

9.58

2.16

files > 1 block

4056222

936757

23.09

3.80

Fragmentation index: 8.80 percent.

Таблица 1. Только треть файловой системы задействована, однако Ext3 фрагментирована.


Между тем дефрагментатора для Ext3 не существует. Программа ext2_defrag, созданная много лет тому назад, долгое время не развивалась, и не поддерживает современные версии Ext2 и Ext3. Единственный способ дефрагментации системы состоит в том, чтобы скопировать все файлы во вновь созданную файловую систему. А можно упаковать их в tar архив, который, в идеале, расположен в другой файловой системе. Затем следует удалить оригиналы файлов, а потом распаковать архив. Эта операция имеет приятный побочный эффект: воссозданные директории будут содержать только действительно находящиеся в них файлы.

При помощи вышеописанных программ, измеряющих фрагментацию, вы можете выявить директории, наиболее подверженные фрагментации (например те, что часто используются каким-либо приложением для создания и удаления файлов) и можете провести дефрагментирующее копирование только этих директорий. В случае с нашим IMAP сервером, копирование дало ощутимый эффект - во время интенсивного почтового трафика, пики ввода/вывода существенно снизились (odi[5]).


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