О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.
Показаны сообщения с ярлыком 1230.Тесты. Показать все сообщения
Показаны сообщения с ярлыком 1230.Тесты. Показать все сообщения

06.09.2008

UFS: эффект асинхронного монтирования

2004 г

Обескураживающие результаты тестирования файловой системы FreeBSD (UFS2, принятая в качестве нативной в 5-й ветке), выполненные ранее, не давали мне покоя. И даже то, что при использовании программного RAID (измерения проводились на дисках, объединенных ccd) скорость файловых операций уже не смотрелась столь мрачно, дела не меняло -- ведь сама по себе файловая системы тут не при чем.

И потому, установив новую ОС - DragonFlyBSD, - я решил вернуться к тестам на скорость файловых операций. В отличие от FreeBSD 5-й ветки, DFBSD сохранила верность первой версии файловой системы UFS. На этот раз в центре внимания был эффект асинхронного монтирования при отключении SoftUpdates - результаты предыдущих измерений показали, что при включении последнего механизма опция async просто игнорируется. Хотя, должен заметить, так было не всегда: в известной статье МакКазика и Ганджера (русский перевод) описаны результаты измерения быстроты файловых операций при включении SoftUpadates и монтировании в асинхронном режиме.

Измерения проводились на ноутбуке Toshiba Satellite Pro A40 с процессором Pentium-4/2,66 (Mobile), 512 Мбайт памяти, ATA-100 винчестером неизвестного происхождения (ни одна из утилит имени производителя мне так и не открыла) объемом 40 Гбайт, со скоростью вращения 4200 об./мин. В качестве "пробы пера", как и ранее, выполнялись следующие операции:

  • копирование массива смешанных данных общим объемом 830 Мбайт;
  • распаковка и копирование дерева портов FreeBSD (объемом около 25 Мбайт);
  • копирование avi-файла размером 693 Мбайт.

Тесты для Ext2fs и ReiserFS проводились под управлением операционной системы Linux (дистрибутив Archlinux, ядро 2.6.8.1, установленное из умолчального бинарного пакета), для UFS - под DragonFlyBSD (октябрьский снапшот 2CSNAP-20041021-1130-GCC3, собранный с gcc3.4.1, ядро GENERIC).

Тесты осуществлялись на специально выделенном разделе объемом 5 Гбайт, на котором последовательно создавались файловые системы: Ext2fs, ReiserFS (для сравнения) и UFS. Для последней замеры проводились при включенном и отключенном механизме SoftUpadates. В последнем случае файловая система монтировалась в двух режимах: сначала умолчальном, частично асинхронному (опция noasync), а затем - чисто асинхронному (опция async). О смысле этих опций говорилось в одной из предыдущих заметок, а механизм SoftUpadates был описан в книге "Доступный Unix">. В каждых условиях все три теста выполнялись трижды (с размонтированием файловой системы в промежутке), за итоговый результат принималось среднее арифметическое. Что и можно видеть в таблице (результаты в секундах).

Тест Работа с данными Работа с портами Большой файл
File Systems Copy Delete Untar Copy Delete Copy
Ext2fs 136 9 36 189 39 98
ReiserFS 150 3 46 96 30 95
UFS, noasync 393 49 271 356 258 115
UFS, async 252 14 74 129 69 116
UFS, SoftUp 274 15 235 339 188 115

Результаты измерений, которые можно видеть также на рисунке, несколько отличаются от полученных ранее. Что можно связывать с тем, что на низкоскоростном "железе" (напомню, речь идет о медленном ноутбучном винчестере) детали реализации конкретных файловых систем оказываются менее значимыми.

Рисунок. Результаты измерения быстродействия

Чтобы более не возвращаться к этому вопросу, начну с копирования большого файла. Тут мы видим распадение результатов на две группы: обе файловые системы Linux (лучшие, но практически равные, результаты) и все вариации на тему UFS (результаты столь же ровные, но на 15-20% худшие). Очевидно, это можно связать не столько с устройством файловых систем, сколько с быстродействием ATA-интерфейса в этих операционках.

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

Вполне предсказуемо, что во всем блеске асинхронный режим UFS проявляется на работе с портами - то есть огромным количеством очень маленьких файлов. Тут она не только более чем вдвое выигрывает у механизма SoftUpdates, но и (спешите видеть, впервые в мировой истории!) вполне значимо опережает Ext2fs на операции копирования. Хотя до ReiserFS и не дотягивает - ведь это коронный номер последней.

В общем, можно констатировать, что отказ от SoftUpdates в сочетании с асинхронным монтированием несколько повышает быстродействие файловых операций на UFS. Конечно, это влечет за собой и снижение надежности файловой системы. А поскольку никаких механизмов журналирования для UFS нет и не предвидится, последний фактор является определяющим для серверных применений. На пользовательском же десктопе, снабженном бесперебойником (а последний, ИМХО, должен являться непременным атрибутом нормальной Unix-машины), это не столь критично. Конечно, монтировать в асинхронном режиме корневую файловую систему не стоит. Да и не имеет смысла - по нормальному она изменяется только при реинсталляции ядра. Однако для таких ветвей файловой системы, как /usr/src, /usr/obj, /usr/ports, /usr/ports/distfiles, асинхронное монтирование видится вполне подходящим. Конечно, наибольший эффект оно дало бы для каталога /home. Однако тут каждый должен решать для себя сам - рисковать ли хоть ничтожным шансом на разрушение файловой системы ради быстродействия, или нет.

UFS2 на ccd: продолжение банкета с быстродействием

2004 г

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

Иными словами, визуально при работе я, конечно, видел, что UFS2 медленнее всех когда-либо реально применявшиеся файловых систем для Linux. Но уж далеко не настолько, как получалось по результатам измерений.

И тут я сообразил, что реально-то я работаю не совсем в той конфигурации, которая была описана в той заметке. Потому что на самом деле в моей машине живет еще два диска - Seagate Barracuda IV, по 80 Гбайт каждый, объединенные в программный RAID нулевого уровня (strip) посредством ccd; просто на время тестирования они были отключены физически. И я решил посмотреть - а дает ли это что-нибудь в плане быстродействия.

Итак, методика измерений осталась прежней, объекты для манипулирования - также. А из железа добавились два вышеперечисленных винчестера, один - слейвом на первом IDE-канале (в паре с 40-гигабайтником, несущим систему), другой - мастером на втором. На них размещались: вначале по гигабайтному swap-разделу, далее - по разделу 4.2BSD, размером 20 и 60 Гбайт на каждом.

Двадцатигигабайтные разделы были объединены в ccd-устройство со стриппингом, под UFS2, монтировавшееся в качестве /usr/ports/distfiles - о нем далее речи не будет. А 60-гигабайтные разделы составили еще один программный ccd-RAID, также с расслоением (размер блока - 128 Кбайт, примерная методика описана в одной из моих заметок по FreeBSD). Объединенный раздел с UFS2 монтировался у меня в обычном состоянии как /home и нес на себе все данные, с которыми я постоянно работаю (средняя заполненость - около 70%).

Перед началом измерений файловая система /home была размонтирована и смонтирована как /mnt/hd. Как и в прошлый раз, последовательно выполнялись копирование массива данных и его удаление, развертывание, копирование и удаление дерева портов, копирование и удаление большого avi-файла. После каждого цикла файловая система размонтировалась, перемонтировалась заново и измерения повторялись - всего троекратно, в качестве результатов принимались средние значения.

Создавать на ccd специальный раздел специально для тестирования у меня возможности не было, поэтому все действия (копирование массива данных, развертывание и копирование дерева портов, копирование большого файла) выполнялись прямо в рабочем разделе. Что, конечно, оказывало некоторое (из общих соображение - негативное) влияние на результаты. Тем не менее, как можно видеть из таблиц 1 и 2, они оказались весьма показательными. Для большей наглядности я разделил данные для копирования/"растаривания" и для удаления. В качестве предмета сравнения выступили результаты для UFS2 и Ext2fs из прошлой заметки - обе в "умолчальных" режимах на 5-гигабайтном разделе одиночного диска.

Таблица 1. Копирование и "растаривание"

FS+Mode Data Untar Ports Big
UFS,default 211 189 255 104
UFS,ccd 185 107 175 83
Ext2,default 71 90 68 45

Сначала о копировании и "растаривании". Уже копирование массива данных дало более чем 10-процентный выигрыш в скорости против UFS2 на одиночном диске. При "растаривании" превосходство составило уже почти 50%, при копировании дерева портов - более 30%, и при копировании большого файла - более 20% (рис. 1).

Рис. 1. Копирование и "растаривание"

Результаты - не потрясающие воображения, но вполне весомые, а для "растаривания" уже сравнимые с ext2fs. Однако при удалении файлов все оказалось еще интересней (см. табл. 2).

Таблица 2. Удаление

FS+Mode Data Ports
UFS,default 7 92
UFS,ccd 5 34
UFS,ccd 5 34

Удаление массива данных с ccd-раздела происходило быстрее, чем с единичного UFS2, и даже чем с раздела ext2fs - хотя, при столь низких абсолютных значениях их трудно считать статистически значимыми. А вот на удалении дерева портов выигрыш во времени составил более 60% (рис. 2). Удаление же единичного файла происходило практически мгновенно и потому время его здесь не приводится.

Рис. 2. Удаление

Таким образом, на типично пользовательских задачах использование программного RAID со стриппингом (по крайней мере, в исполнении ccd, для vinum данных у меня, по понятным причинам, нет) дает вполне реальный (а иногда и просто значительный) прирост в быстродействии файловых операций. А поскольку нынче редкая мама не оснащается дополнительным IDE-контроллером, появляется возможность разнести винчестеры на отдельные линии (даже без задействования аппаратного ATA RAID), что должно еще более улучшить результаты.

Возникает еще один интересный вопрос: а как влияет (и влияет ли вообще) на соотношение быстродействия файловых систем рост физического быстродействия винчестера. Поскольку давеча я обзавелся SATA-диском, теоретически более быстрым, чем мои относительно старые PATA, рассчитываю в ближайшее время исследовать и этот вопрос.

FreeBSD vs Linux: быстродействие файловых систем

2004 г

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

Цели и задачи

Сначала я ставил себе очень ограниченную задачу - измерить быстродействие современной файловой системы FreeBSD - UFS2 - в разных режимах монтирования. Как известно, по умолчанию она монтируется в т.н. режиме noasync, при котором изменения метаданных файлов записываются на диск синхронно, а для собственно данных применяется асинхронная запись, то есть кэширование. Что изначально ставит UFS2 в невыгодное (с точки зрения быстродействия) положение по сравнению с Linux, где по умолчанию для большинства файловых систем, поддерживаемых этой операционкой в качестве нативных, принят чисто асинхронный режим - с кэшированием не только данных, но и метаданных.

Однако теоретически чисто асинхронный режим существует и во FreeBSD, хотя использование его крайне не рекомендуется во всех официальных документах проекта, как способствующее падению надежности. Что, безусловно, верно для серверов, но не кажется столь уж критичным для десктопов, оснащенных бесперебойниками (а бесперебойник, по моему скромному мнению, - непременный атрибут любой Unix-машины, особенно в условиях постсоветской действительности). Так что возникло естественное желание - поглядеть, а как ведет себя UFS2 в асинхронном режиме.

Сразу замечу, что первые же результаты измерений оказались несколько неожиданными и, по крайней мере для меня - не вполне понятными. И потому для прояснения ситуации я решил сравнить их с проведенными в аналогичных условиях измерениями для ext2fs в Linux. Ну а дальше - больше, стало интересным сопоставление с прочими файловыми системами Linux. И, наконец, возник вопрос, а как эти операционки работают с файловыми системами друг друга. Поскольку поддержка в Linux UFS2 ныне не реализована (да и включить поддержку UFS просто - задача не тривиальная), пришлось ограничиться измерениями только для ext2fs под FreeBSD. Таким образом и определились

Участники тестирования

Итак, первым участником, естественно, стала UFS2, образованная с параметрами по умолчанию sysinstall (размер блока - 16384 байт, размер фрагмента - 2048), с предусмотренным этой утилитой включением режима SoftUpdates. И монтируемая в умолчальном же, то есть частично асинхронном (опция -o noasync, принимаемая по умолчанию при исполнении команды mount) режиме.

Далее, исходя из общих соображений, можно было предполагать, что на быстродействие файловых операций может влиять также опция -o noatime, запрещающая обновление времени последнего доступа для файлов. Затем, разумеется, был опробован чисто асинхронный режим (опция -o async). И, наконец, сочетание обеих опций, от которого теоретически следовало ждать максимального быстродействия.

В качестве объектов сравнения выступили нативные файловые системы Linux. В первую голову это, конечно, была классическая ext2fs, монтировавшаяся в двух режимах - умолчальном и в режиме -o noatime.

Затем - ее журналируемый вариант, ext3fs. Для нее штатно предусмотрено три режима использования - полного журналирования (опция -o data=journal), при котором фиксируются операции не только с метаданными файлов, но и их данными, стандартного частичного журналирования (опция -o data=ordered, при которой данные и метаданные группируются в единый блок транзакции) и режима writeback, в котором никакого журналирования данных не осуществляется. От использования опции -o noatime я в данном случае отказался (честно говоря, просто из лени - хотя, как стало ясным из результатов, ничего принципиально нового эта опция не дала бы).

Далее - ReiserFS, самая претенциозная (и, пожалуй, наиболее популярная среди пользователей Linux) журналируемая файловая система. Здесь, кроме умолчального, я снова опробовал режим с отказом от обновления atime - и, как показала практика, не напрасно).

Аналогично я поступил и с XFS - измерения на ней производились в умолчальном режиме и в режиме с опцией -o noatime. И, наконец, в отношении JFS я ограничился режимом по умолчанию - так как этой системой никогда практически не пользовался, мало чего о ней знаю и привлек ее к делу исключительно для сравнения.

Все файловые системы создавались посредством соответствующих утилит (mke2fs - для ext2fs и ext3fs, mkreiserfs и mk.xfs - для одноименных файловых систем, jfs_mkfs - для JFS) с параметрами по умолчанию. Исключением стала XFS, для которой размер allocation group и объем журнала были подобраны в соответствие с рекомендациями Дэниэла Роббинса (объем журнала - 32 Мбайт, минимум одна allocation group на 4 Гбайт дискового пространства, отводимого под эту файловую систему).

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

О тестовой платформе

Измерения производились на подручном железе, каковое содержало:

  • процессор Pentium-4/2,53 Ггц, FSB 533, без HT;
  • материнская плата Albatron PX845PE на одноименном чипсете, в варианте с дополнительным контроллером ATA RAID/SerialATA Promise FastTrack 376 (впрочем, не задействованным);
  • 1 Гбайт оперативной памяти (2x512 PC-2700, продававшейся под брэндом "якобы Samsung");
  • жесткий диск Seagate Barracuda IV 40 Гбайт, интерфейс ParallelATA, 7200 об./мин., подключенный как single на 1-й канал стандартного ATA-контроллера из южного моста ICH4.

Прочие компоненты, типа CD-ROM (single на втором IDE-канале), значения в данном случае не имеют.

На диске имелось 4 первичный раздела. Первый, объемом 30 Мбайт с файловой системой ext2fs, исполнял функции загрузочного и нес на себе только GRUB (и ядро Linux). Второй раздел был определен как BSD-слайс, и в нем, на файловой системе UFS2, размещалась FreeBSD 5.2.1. Третий раздел был объявлен DOS Extended и нес на себе Archlinux 0.6 (ядро 2.6.6). Детали их разбиения, а также файловые системы, в данном контексте не существенны.

Во о избежание недоразумений замечу, что в обеих ОС диск функционировал в штатном режиме UDMA100, что определялось утилитами atacontrol во FreeBSD и hdparm в Linux.

И еще: FreeBSD была подвергнута процедуре make world с флагами оптимизации -O1 и -march=pentium4. Ядро, пересобранное на базе очень облегченного GENERIC (с исключением поддержки всего отсутствующего, типа SCSI и сетевых карт), компилировалось с флагом -O2 под тот же Pentium-4. Для Archlinux использовалось штатное прекомпилированное (из репозитория проекта - current) ядро, собранное, как и вся система в целом, с флагами -O2 -march=i686.

Впрочем, все сказанное в предыдущем абзаце вряд ли способно было кардинально повлиять на производительность при файловых операциях. И потому для нас важен только четвертый первичный раздел, объемом 5,5 Гбайт, который и подвергался всяческим издевательствам. Для чего на нем, после присвоения соответствующего идентификатора (4.2BSD или Linux native, соответственно), на нем создавались перечисленные в предыдущем разделе файловые системы, которые монтировались с указанными опциями. А на них уже помещались те данные, которые представляли собой

Объекты тестирования

Измерения я затевал для личных целей, и потому меня больше всего интересовали операции с теми данными, с которым я имею дело регулярно. А это а) массивы смешанных данных (тексты и иллюстрирующая их графика), б) массивы из огромного количества очень маленьких файлов (типа дерева портов FreeBSD и аналогичных систем управления пакетами из Source Based дистрибутивов Linux) и в) большие файлы, от объема CD и выше. В соответствие с этим я и подобрал тестовые объекты.

Во-первых, это был каталог моих рабочих материалов - файлов в форматах plain text и html с иллюстрациями в форматах gif, tiff, jpeg, png, объем которых варьировал от нескольких килобайт до первых десятков мегабайт. Для оживления картины я разбавил его звуковыми файлами mpeg (от 1,5 до 6 Мбайт каждый). В результате первый тестовый массив суммарно составил 830 Мбайт.

Вторым объектом было подручное дерево портов FreeBSD от 6 мая 2004 г., объемом 24,2 Мбайт, и результат его "растаривания", что давало каталог в 124 Мбайт. Специфика его - в том, что он образован огромным (свыше 100 тысяч) количество файлов, преобладающий размер которых - несколько сот байт.

Наконец, третьим объектом стал avi-файл размером в CD - 693 Мбайт.

Ничего лучшего, чем измерять время копирования этих массивов, я не придумал. То есть каталог данных копировался командой вида

$ cp data newdata

с последующим уничтожением целевого каталога

$ rm -Rf newdata

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

$ tar xzvf ports.tar.gz

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

date >> file_of_result &&
command1 &&
date >> file_of_result &&
...
date >> file_of_result &&

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

Результаты

Результаты измерений скорости выполнения всех операций над тремя объектами приведены в таблице и на рис. 1-3. Единицы измерения - секунды, соответственно, меньшие значения везде отвечают лучшим показателям. Которые мы и рассмотрим последовательно для всех файловых систем.

UFS

Начнем с той, что послужила первопричиной этой заметки - с UFS2. Напомню, что она монтировалась последовательно в четырех режимах - умолчальном, с включением опции -o noatime, в чисто асинхронном режиме (опция -o async) и, наконец, с включением обеих этих опций. Теоретически рассуждая, в этом порядке и должно возрастать быстродействие файловых операций. Что же мы видим на практике?

Таблица. Результаты измерения (в сек.) быстродействия файловых операций в различных файловых системах

Тест

Работа с данными

Работа с портами

Большой файл

FS+Mode

Copy

Delete

Untar

Copy

Delete

Copy

Delete

UFS,default

211

7

189

255

92

104

0

UFS,noatime

210

7

194

333

99

102

0

UFS,async

211

8

201

352

99

103

0

UFS,both

209

6

202

344

98

103

0

Ext2,FreeBSD

222

25

280

309

222

150

1

Ext2,default

71

6

90

68

7

45

0

Ext2,noatime

73

6

93

68

7

46

0

Ext3,journal

123

6

134

58

6

98

1

Ext3,ordered

81

15

107

115

17

50

16

Ext3,writeback

91

7

107

68

51

53

1

Reiser,default

100

2

59

51

7

44

1

Reiser,noatime

89

2

71

26

7

47

1

XFS,default

95

9

76

83

41

48

0

XFS,noatime

97

9

80

74

42

49

0

JFS,default

132

13

267

160

19

91

0

Результаты по копированию массива данных (см. рис. 1) во всех четырех режимах можно считать практически идентичными. Казалось бы, чуть лучшие результаты позволяет получить отказ от обновления atime, однако и абсолютно, и относительно разница ничтожна. И в любом случае, включение асинхронного режима не обеспечивает никакого скачка в быстродействии, которого можно было бы ожидать, исходя из общих соображений. Скорость удаления смешанного массива файлов также примерно одинакова: несколько лучшие результаты при включении обеих опций лежат, скорее всего, в пределах ошибки эксперимента (точность вывода команды date - в пределах одной секунды).

Рис. 1. Работа с массивом смешанных данных

Еще более впечатляющий график демонстрируют результаты работы с деревом портов (рис. 2). Теоретически можно было бы ожидать резкого скачка быстродействия при асинхронной обработке огромного количества мелких файлов. Однако на практике мы видим прямо противоположную картину: наилучшие результаты и при разворачивании тарбалла, и при копировании дерева портов, и при его удалении получаются как раз при умолчальном, синхронном для метаданных, режиме. Причем в случае копирования превосходство его выглядит вполне значимым: включение любой из дополнительных опций (а особенно - их обеих) вызывает падение скорости этой операции на 30-50%.

Рис. 2. Работа с деревом портов

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

Рис. 3. Работа с большим файлом

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

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

Ext2fs

Начнем опять же с классики жанра - традиционной ext2fs. При копировании массива смешанных данных она показывает завидное быстродействие, более чем втрое превосходящее скорость этой операции в UFS2, при сопоставимой (но формально лучшей) скорости удаления. Если же отвлечься от абсолютных цифр, можно видеть, что включение опции noatime и здесь, вопреки ожиданию, ничего не дает в плане производительности.

Та же картина наблюдается в тесте с деревом портов. И развертывание тарбалла, и копирование каталога мелких файлов, и его удаление происходят одинаково быстро вне зависимости от того, обновляется ли время последнего доступа или нет. Относительно UFS2 это самое "быстро" выражается двух- (для операции "растаривания") и даже пяти- (для копирования) кратным превосходством. Ну а удаление дерева портов вообще более чем на порядок быстрее - фактически такое же быстрое, как и удаление смешанного массива.

При работе с большим файлом также никаких неожиданностей не наблюдается: копируется он быстро (более чем вдвое быстрее, чем в UFS2), а удаляется практически мгновенно.

В общем, приходится с прискорбием констатировать, что в плане быстродействия UFS2 и близко не лежала с ext2fs, чем бы это ни объяснялось (desktop-пользователю эти объяснения по большому счету до лампочки). И потому интересно посмотреть, а не проявит ли себя ext2fs со столь же хорошей стороны также и во FreeBSD?

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

Конечно, ext2fs по самой своей природе не может быть такой же надежной, как UFS2. И ее потенциальную склонность к разрушению (а были времена, когда ext2fs почти гарантированно рушилась при аварийном завершении работы системы) пытается скомпенсировать настраивающая ее журналируемость, прикручивание которой дает самостоятельную файловую систему - ext3fs. Посмотрим, дорого ли приходится платить за это в плане скорости.

Ext3fs

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

Вопросы надежности мы здесь не обсуждаем, а вот что касается быстродействия... При копировании массива смешанных данных режим journal действительно оказывается наиболее медленным, однако первенство остается за режимом ordered (а не writeback, как следовало бы ожидать). А вот стирание результатов этого копирования вообще показывает парадоксальную картину: если при режимах journal и writeback скорость удаления каталога ожидаемо быстра (практически такая же, как в ext2fs), то в режиме ordered эта процедура выполняется просто неприлично медленно (15 секунд против 6-7, как можно видеть из таблицы).

Рассмотрение работы с мелкими файлами оставляет очень противоречивое ощущение. Развертывание архива - наиболее медленно в режиме полного журналирования, и несколько быстрее (и одинаково) - в обоих режимах журналирования частичного. С копированием дерева портов неожиданно лучше всего справляется режим journal, режим writeback оказывается несколько медленнее, а ordered эту задачу просто проваливает - скорость операции удаления оказывается в нем вдвое ниже остальных.

Дальше - больше: график скоростей удаления дерева портов просто обратен теоретически ожидаемому: блестящий результат в режиме полного журналирования (6 секунд - чуть не лучше, чем для ext2fs), посредственный (17 секунд) - в режиме ordered, и наихудший для всех файловых систем Linux (51 секунда) - в якобы быстрейшем режиме writeback.

Наконец, обращение с большим файлом дает нам очередную (уже ожидаемую) неожиданность: распределение скоростей копирования повторяет таковое для дерева портов (лучший результат - в режиме ordered, похуже, но близкий - в режиме writeback, и существенно худший - в режиме journal, 50, 53 и 98 секунд, соответственно). Но зато при удалении этого самого большого файла режим ordered отличился как никто: в нем эта процедура заняла аж 16 секунд. Не просто хуже всех, а недосягаемо хуже. И еще раз подчеркну, что речь идет не о случайном всплеске, а о среднем из трех измерений, разделенных перемонтированием файловой системы.

Как будет видно из дальнейшего, ext3fs с точки зрения быстродействия вообще смотрится бледновато на фоне прочих файловых систем, с которыми работает Linux. Но против FreeBSD она все равно сохраняет преимущество по всем позициям: усилиями всех трех режимов журналирования изначальную ext2fs не удается низвести до уровня частично синхронной UFS2. И даже худший результат ext3fs при работе с портами остается недосягаемых для той ОС, в которой сама идея портов появилась впервые.

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

ReiserFS

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

И тут мы впервые видим торжество теоретических предсказаний: умеренное быстродействие при копировании нашего массива в режиме по умолчанию увеличивается на 10% при включении режима noatime - со 100 секунд до 89 (хотя и не достигает рекордного). Но зато рекорд бьет удаление копируемого массива - по 2 секунды в каждом из режимов.

Дерево портов... Превосходные результаты при "растаривании" и копировании в умолчальном режиме. При отмене обновления atime в первом случае они несколько ухудшаются. Но зато - браво - копирование с этой опцией осуществляется практически вдвое быстрее, чем без нее; такого результата мы еще не видели. И опять ReiserFS близок к рекорду при удалении портового безобразия - финишируя голова в голову с ext2fs.

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

XFS

На массиве данных общего характера копирование дает результат, близкий к гармоническому среднему, время же удаления их кажется чуть-чуть завышенным (9 секунд).

Работа с портами - на среднем уровне в отношении "растаривания" и копирования. И - неожиданно большое время удаления дерева портов (более 40 секунд), приближающееся к "анти-рекорду" writeback-режима ext3fs (хотя все равно много лучшее, чем для UFS2).

А вот результат по большому файлу (48-49 секунд) - не порадовал: хотя он и в числе лучших, но от "мультимедийной" файловой системы я ожидал большего. Хотя, может быть, с точки зрения SGI, это 700 Мбайт - это отнюдь не много? И в утешение - провала при удалении большого файла также не отмечается:-).

JFS

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

  • худший среди всех файловых систем Linux результат в копировании смешанного массива и второй с конца (после провала ordered-режима etx2fs) - в его удалении;
  • худший результат "растаривания" среди всех нативных файловых систем вообще, включая UFS2; хуже оказалась только ext2fs из под FreeBSD - но ведь с чужака и взятки гладки;
  • прямо скажем, не блестящее время удаления дерева портов;
  • копирование большого файла - финиш в плотной группе отстающих.

В общем, JFS, единственной из поддерживаемых Linux файловых систем, оказалась сопоставимой с UFS2 по быстродействию (вернее, отсутствию оного). Конечно, нельзя исключить, что знатоки ее могут повысить производительность какими-либо опциями; в частности, я где-то слышал, что Linux-версия JFS стандартно работает чуть не в чисто синхронном режиме - глядя на результаты, в это вполне можно поверить. Однако, повторяю, по умолчанию она предстает перед пользователем в качестве самой медленной.

Выводы

Должен сказать, что проведенные измерения существенно перевернули мои представления о файловых системах вообще (хотя кое в чем и укрепили).

В частности, я всегда подозревал, что обе файловые системы FreeBSD - и старая UFS, и новая UFS2, - уступаю своим Linux'овым сестрам в быстродействии. Да это обычно видно и, что называется, органолептически. Однако я никак не ожидал, что для UFS2 в количественном отношении отставание окажется столь существенным. Должен заметить - выполнявшиеся мной ранее измерения для UFS просто столь разительной тормознутости не показывали - даже в отношении ext2fs (для ReiserFS меньший разрыв можно было бы объяснить младенческим тогда ее возрастом). Не исключено, что это - расплата и за 64-битную адресацию, и за вдвое увеличенные inodes...

Далее, я не ожидал столь достойных результатов ReiserFS не только в отношении очень маленьких файлов, но и во всех остальных тестах. Так что беру назад все не очень хорошие слова, которые ранее говорил в ее адрес. Правда, непроверенным осталось эмпирически наблюдаемое (но не подтверждавшееся количественно) явление падения ее производительности на больших (более 100 Гбайт) разделах, размещенных на программном RAID - но для многих ли desktop-пользователей это актуально?

Не показала себя в ожидавшемся блеске и столь любимая мною раньше XFS. Все же мало когда приходится работать с файлами более объема сидюшника, а в этих пределах она оказалась не быстрее ReiserFS.

А вот в чем измерения меня укрепили - так это в предубежденном (и неблагоприятном) отношении к ext3fs. И дело даже не в том, что хоть каком-нибудь ее режим "отличился" хотя бы на одном тесте. Недовольство вызывает именно непредсказуемость ее поведения в зависимости от режима и характера данных. Вероятно, разработчики имели основания для заключения об оптимальности режима ordered - однако основывались они, судя по всему, на задачах серверных, но отнюдь не десктопных.

Так какую же файловую систему выбрать простому настольному пользователю для своей отдельно взятой персоналки? Мой ответ не будет блистать оригинальностью, если я заявлю со всей определенностью: каждому овощу - свой фрукт. И бесполезно пытаться найти систему, одинаков быструю и для хранения дерева портов (или их Linux-аналогов), и для сборки iso-образов под резервное копирование, и прочая, и прочая, и прочая.

К счастью, пользователь FreeBSD избавлен от этих терзаний - UFS и UFS2 суть объективные реальности, данные ему в ощущениях берклианских разработчиков. Только он должен понимать, что по крайней мере при работе с файлами ему придется поступиться быстродействием ради стройности и аккуратности используемой системы. Впрочем, не компенсируется ли потеря времени на копировании файлов отсутствием мытарств с несовпадением версий библиотек или компиляторов?

А вот пользователю Linux есть над чем поломать голову. Потому что однозначно я не рекомендовал бы к употреблению только JFS - да и то, не факт, что, прочитав многопудовую документацию к ней, я был бы столь категоричен (другое дело, что пока ни одна из особенностей этой файловой системы не способна подвигнуть меня на такое чтение, тем более по англицки).

Ибо даже нелюбимой мною ext3fs можно найти применение. В частности, для корневой файловой системы в том случае, когда из нее в отдельные ветви вынесены /var, /usr, /opt (если в данном дистрибутиве задействуется активно), и, конечно же, /home.

Для первых трех ветвей подходящей видится ReiserFS. Особенно если у нас - Source Based дистрибутив, использующий какую-либо портообразную систему. И к слову - идеальной она окажется именно тогда, когда дерево этих портоидов вынесено в отдельную ветвь внутри /usr или /var. А еще измерения склонили меня к мысли, что и для /home ReiserFS более чем пригодна - раньше я ничего, кроме XFS, в этом качестве не признавал. Хотя и теперь не вижу причин, почему бы благородному дону не размещать на XFS свои данные - особенно если он не имеет привычки часто и в большом количестве их удалять.

Наконец, ext2fs - отнюдь не худший выбор для многих пользователей, не желающих заморачиваться созданием множества разделов и подбором под них идеальных файловых систем (при условии наличия бесперебойника, разумеется). И уж совсем незаменимой она оказывается а) для обмена данными с установленной на той же машине FreeBSD, и б) для раздела /boot в случае использования мультизагрузчика GRUB. Так что и старушку ext2fs рано еще списывать в тираж...

19.08.2008

FreeBSD 6 и AMD64: тесты файловых операций

2 августа 2005 г

В прошлой своей заметке я говорил, что первое впечатление от 6-й версии FreeBSD на платформе AMD64 - повышение быстродействия файловых операций, не просто видимое невооруженным глазом, а так даже бросающееся в глаза. И возникает резонный вопрос - а чем же оно обусловлено? Для ответа на него я предпринял маленькое исследование, результаты которого и предлагаются ныне вниманию читателей.

Очевидно, что для количественной оценки быстродействия файловых операций скорость их нужно померять. Поскольку измерения эти имели целью исключительно удовлетворение собственного любопытства, меня больше всего интересовали операции с теми данными, с которым я имею дело регулярно (и для которых мной ранее проводились измерения: см. здесь и здесь). А это а) массивы смешанных данных (тексты и иллюстрирующая их графика), б) массивы из огромного количества очень маленьких файлов (типа дерева портов FreeBSD и аналогичных систем управления пакетами из Source Based дистрибутивов Linux) и в) большие файлы, от объема CD и выше. В соответствие с этим я и подобрал тестовые объекты.

Во-первых, это был каталог моих рабочих материалов - файлов в форматах plain text и html с иллюстрациями в форматах gif, tiff, jpeg, png, объем которых варьировал от нескольких килобайт до первых десятков мегабайт. Для оживления картины я разбавил его звуковыми файлами mpeg (от 1,5 до 6 Мбайт каждый). В результате первый тестовый массив суммарно составил 830 Мбайт.

Вторым объектом было подручное дерево портов FreeBSD от 6 мая 2004 г., объемом 24,2 Мбайт, и результат его "растаривания", что давало каталог в 124 Мбайт. Специфика его - в том, что он образован огромным (свыше 100 тысяч) количество файлов, преобладающий размер которых - несколько сот байт.

Наконец, третьим объектом стал avi-файл размером в CD - 693 Мбайт.

Ничего лучшего, чем измерять время копирования этих массивов, я не придумал. То есть каталог данных копировался командой вида

$ cp data newdata

с последующим уничтожением целевого каталога

$ rm -Rf newdata

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

$ tar xzvf ports.tar.gz

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

date >> file_of_result && \
command1 && \
date >> file_of_result && \
...
date >> file_of_result &&

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

Тестовая платформа была описана в предыдущей заметке, поэтому остановлюсь на ней вкратце:

  • процессор AMD64 3200+ (реальная частота 2 Ггц);
  • материнская плата Epox EP-9NDA3I на чипсете nForce3 250;
  • память 1 Гбайт (2 модуля по 512 Мбайт);
  • видеокарта Gigabyte на Radeon 9250, 128 Мбайт;
  • винчестер SATA Seagate Barracuda 120 Гбайт, 7200 об./мин;
  • два винчестера PATA на первом канале - Seagate Barracuda IV, 7200 об./мин - 40 Гбайт (Master) и 80 Гбайт (Slave);
  • CD-RW/DVD+RW NEC 350AG - мастером на втором IDE-канале.

Прочие компоненты в контексте темы значения не имеют. Диски, согласно показаниям утилиты atacontrol, работали в режимах SATA150 и DMA100, соответственно.

Для начала измерения выполнялись на рабочей системе - FreeBSD 6 beta1, с ядром, пересобранным с истреблением встроенной поддержки всех SCSI- и сетевых адаптеров. Система эта лежала на диске SATA, разбитом следующим образом:

Тестовые данные были размещены в разделе /home, практически пустом (за исключением профильных файлов пользователя), отформатированном под UFS2 с включенным механизмом SoftUpdates.

Результаты измерений можно видеть в первой строке таблицы.

Таблица 1


Данные
Порты

Бол. файл

Copy Delete Untar Copy Delete Copy
AMD64-SATA 130 8 79 109 58 50
P-4/2,53 211 7 189 255 92 104

В сравнении с ранее выполненными измерениями для Pentium-4 с тактовой частотой 2,53 Ггц под управлением FreeBSD 5.2.1 (для i386, разумеется) результаты выглядят впечатляюще. Однако чем они обусловлены - сменой платформы, версии ОС или еще какими факторами, - из этого сравнения остается неясным. И не будем забывать, что нынешние измерения производились на винчестере SATA, тогда как предыдущие - на PATA (тот же самый Seagate Barracude IV 40 Мбайт).

К счастью, мы располагаем возможностью снять хотя бы одну неопределенность, так как текущая платформа располагает винчестером, не просто аналогичным прежней, но и вообще тем же самым - Barracude IV 40 Мбайт. Повторение измерений на нем (при той же файловой системе UFS2) дало результаты просто обескураживающие: скорость всех файловых операций на диске PATA снизилась в полтора-два раза. При этом результаты по копированию массива данных и большого файла, а также по удалению развернутого дерева портов оказываются практически идентичными таковым, полученным на машине с P-4/2,53 и тем же самым винчестером (таблица 2). А большая скорость "растаривания" и копирования дерева портов в текущей конфигурации может быть обусловлена большей производительностью AMD64/3200+ по сравнению с P-4/2,53 - ведь для обеих этих операций вклад подсистемы процессор/память будет существенным.

Таблица 2


Данные
Порты

Бол. файл

Copy Delete Untar Copy Delete Copy
AMD64-SATA 130 8 79 109 58 50
AMD64-PATA 193 5 136 170 91 101
P-4/2,53-7200 211 7 189 255 92 104
P-4/2,66-4200 274 15 235 339 188 115

Отмеченная закономерность находит свое подтверждение, если сравнить сегодняшние результаты с теми, что были получены на ноутбучном винчестере со скоростью вращения 4200 об./мин и описаны в соответствующей статье. Правда, там речь шла об ОС DragonFlyBSD и файловой системе UFS, и потому строго количественно их сравнивать нельзя. Однако качественная тенденция и тут налицо: падение производительности диска приводит к сильному снижению быстродействия файловых операций - не смотря на несколько более мощный процессор (P-4/2,66) и то, что сама по себе UFS считается несколько более быстрой, чем UFS2 (рисунок).

Диаграмма сравнительного быстродействия файловых операций

Из всего сказанного выше можно сделать неутешительный вывод: в тестах файловых операций под управлением FreeBSD мы измеряем вовсе не быстродействие файловой системы, а быстродействие жестких дисков. И даже более того - не столько само их быстродействие, сколько эффективность реализации драйверов интерфейсов для дисковых устройств: понятно, что интерфейс SATA быстрее, чем PATA, но не в полтора-два раза, как можно было бы заключить из табл.2 и диаграммы.

Так что беру обратно все свои слова, сказанные в предыдущих заметках относительно медлительности файловых систем UFS и UFS2: на самом деле мы не знаем, каково их реальное быстродействие. И, вследствие особенностей работы FreeBSD с дисковыми накопителями, рискуем никогда этого не узнать.

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

И, наконец, последний вывод: приобретая новую машину под FreeBSD-десктоп, берите диски SATA - не пожалеете.