Wiki

Фрагментация и файловые системы Unix

Те, кто уже сталкивался с существенным снижением производительности при работе с дисками в Windows, из-за их сильной фрагментированности, часто задаются вопросом – нужно ли им проводить некоторый периодический анализ и дефрагментацию их Unix систем. В большинстве случаев ответ - нет. Большинство Unix систем не подвержены фрагментации в той же степени, что и FAT или NTFS. Однако, прежде чем давать быстрый ответ “да” или “нет”, давайте взглянем на то, что такое фрагментация и по какой причине Unix системы не так ей подвержены, в отличии от Windows систем и что делать, если Unix система фрагментирована.

Что вызывает фрагментацию?
Фрагментация происходит, когда система не может расположить целый файл на одном непрерывном участке диска. Вместо этого система разбивает файл на несколько фрагментов, которые записываются в разные места на диске и система затем должна поддерживать некую структуру файловой системы для отслеживания мест где расположены все фрагменты файла.

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

Фрагментация в Windows
Посмотреть фрагментацию системы Windows 2000 можно открыв Programs -> Accessories -> System Tools -> Disk Defragmenter

Фрагментация в большей степени проблема файловых систем FAT, нежели NTFS, в основном потому, что создание FAT32 предшествовало многим достижениям в области проектирование файловых систем.

Фрагментация в Unix
Многие современные файловые системы Unix пытаются свести фрагментацию к минимуму, и делается это разными способами. Файловая система ufs, используемая Solaris и почти всеми BSD версиями Unix пытается записывать связанные блоки данных в пределах одной группы цилиндров. Это уменьшает время позиционирования при считывании файлов. Кроме того, когда блок большого размера используется, чтобы улучшить пропускную способность, блоки меньшего размера (фрагменты) используются, чтобы хранить куски файлов не требующие большого блока. Это уменьшает потерю дискового пространства и снижает так называемую “внутреннюю фрагментацию”.

Файловые системы ext2 и ext3, часто используемые на Linux, также пытаются свести фрагментацию к минимуму. Эти системы держат все блоки файла недалеко друг от друга. Это делается с помощью предварительного размещения блоков для файлов перед их использованием. Когда файл увеличивается в размерах, несколько блоков уже зарезервировано – все это снижает фрагментацию. Хотя изредка и необходимо анализировать фрагментацию диска, дефрагментацию проводить не приходится.
Исключение существует для файлов, которые постоянно увеличиваются в размерах, исчерпывая тем самым количество зарезервированных блоков.

Использование fsck
Для получения данных по фрагментированности файловой системы в Unix, обычно используется команда fsck, которая возвращает уровень фрагментации в процентах.
Пример использования fsck (Solaris UFS):
** /dev/rdsk/c1d0s4
** Currently Mounted on /mail
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
77 files, 1004062 used, 2094449 free (81 frags, 261796 blocks, 0.0%
fragmentation)

Результат работы fsck часто можно увидеть при загрузке Linux:
/dev/rwd0e: 22096 files, 299456 used, 506110 free (12078 frags, 61754 blocks,
1.5% fragmentation)

Дефрагментация
Редко можно увидеть Unix систему с фрагментацией большей, чем 5%, однако необходимо знать, как действовать в подобной ситуации. Классический метод состоит в том, чтобы сделать резервную копию файловой системы с помощью dump или ufsdump, перестроить файловую систему с помощью команды newfs или mkfs, и затем загрузить файловую систему с резервной копии. На больших системах эта операция может занять несколько часов.

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

Fragmentation and Unix file systems, ITworld.com, Unix in the Enterprise 9/30/04, Sandra Henry-Stocker, ITworld.com, http://www.itworld.com/Comp/3380/nls_unixfrag040929/index.html
Перевод: Andrew.Selivanov (at) gmail.com, 18.10.2007