geekkoo - Нужна ли дефрагментация? [entries|archive|friends|userinfo]
geekkoo

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Нужна ли дефрагментация? [Dec. 28th, 2007|07:21 am]
Previous Entry Add to Memories Tell A Friend Next Entry
Несмотря на печальные события, связанные с расправой над дважды оправданных судом присяжных военными Аракчеевым и Худяковым, я всё же на сугубо техническую тему хотел написать. Про фрагментацию в Линуксе и нужно ли с ней бороться.
На крысятнике пользователи возбудились на тему - Существенно ли сказывается на производительности фрагментация файловой системы Линукса и нужно ли с ней бороться? Напомню, что в отличии от Вендовся, в Линуксе специализированных дефрагментаторов нет, поскольку справедливо считается, что используемые там файловые системы в нормальном режиме (т.е. когда диск у вас не забит под завязку) фрагментируются слабо. Более того, есть определенные соображения на тему того, что в многозадачной среде фрагментация (даже если она есть) слабо сказывается на производительности, в отличии от какого-нибудь однозадачного ДОСа. Действительно, в многозадачной среде несколько программ могут практически одновременно обращаться к диску, причём к разным его частям, и поэтому типичное рассуждение про позиционирование считывающих головок на твердом диске тут неприменимо. Есть также соображения, что и на NTFS фрагментация не приводит к падению производительности, а продвижение M$-ом своих дефрагментаторов есть простой маркетинговый buzz. Типа, пользователь хочет иметь дефрагментатор - компания ему этот дефрагментатор обеспечивает.

В то же время есть много свидетельств от разных людей, которые утверждают, что примитивная дефрагментация с помощью перемещения файлов существенно улучшает производительность. (В качестве справки - ссылка на блог MooSE, где он собрал парочку скриптов, демонстрирующих, как это делается http://ylsoftware.com/?action=news&na=viewfull&news=379 ). Правда, никаких бенчмарков, демонстрирующих прирост производительности, при этом обычно не приводится, так что тут ситуация полностью как с НЛО, приходится верить на слово.

Я решил восполнить пробел.

Поскольку я недавно приобрел большой диск, то я решил перенести на него раздел /usr. До этого у меня был 20ГБ диск, полностью отданный под / (вместе с /usr). Диск забит под завязку, df сообщает о 100% занятости. Полностью измерение фрагментации на нем мне лень проводить, но очевидно она большая, а несколько ниже будет приведена парочка цифр, подтверждающих это. Диск довольно медленный, hdparm -t показывает примерно 20 МБ/с. Новый же диск (SATA 250ГБ) гораздо быстрее, у него порядка 70 МБ/c. Поэтому для бенчмарка я сделал на нем два раздела. На первый раздел я перенес /usr с помощью команды "mount /dev/sda2 /mnt/hd ; cd /usr ; cp -a ./ /mnt/hd", а на второй залил раздел целиком с помощью "dd if=/dev/hdb2 of=/dev/sda4". Понятно, что при копировании с помощью cp файловая система по ходу дела дефрагментируется (этот раздел будем называть копией), а при копировании с помощью dd, она переносится в том виде, в каком была (этот раздел назовем снимком). Тем самым избавляемся от влияния разности скорости дисков. При перезагрузке либо вручную монтирую копию в /usr, либо монтирую снимок в любой свободный каталог, а потом делаю ссылку /usr на поддиректорию usr в этом каталоге. Файловая система - Reiser3 (её автор, как многие помнят, тоже под следствием по сомнительному поводу).

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

Для этой цели использовался старт среды статистического анализа R. У меня в автозагрузке для этой среды стоит подгрузка дополнительных модулей stats и utils, пакета RGtk2 (обертка для графической библиотеки Gtk2, которое тянет за собой граф-либу cairo, всё это довольно увесистое). Т.е., как мне кажется, многозадачность тут используется в полной мере - много вызовов Хlib одновременно с загрузкой математических библиотек. Как только это все поднимется, то запускается скрипт с единственным вызовом quit(save="no"), после чего снимаются показания секундомера.

Кстати, на тему фрагментации. На разделе-снимке фрагментация библиотеки RGtk2.so весьма прилична (или, скорее, неприлична):
$sudo /sbin/filefrag /usr/lib/R/library/RGtk2/libs/RGtk2.so
/usr/lib/R/library/RGtk2/libs/RGtk2.so: 299 extents found
$ls -lA /usr/lib/R/library/RGtk2/libs/RGtk2.so
-rwxr-xr-x 1 root root 7456747 2007-09-06 01:03 /usr/lib/R/library/RGtk2/libs/RGtk2.so*

Ну, что ж, теперь результаты. Вот с чего я начал (вся система на старом диске):
$time R --no-save < quit.R

R version 2.5.1 (2007-06-27)
Copyright (C) 2007 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Loading required package: RGtk2
Loading required package: cairoDevice
Loading required package: grid
Loading required package: grDevices
[Previously saved workspace restored]

During startup - Warning message:
'length(family)' differs between new and previouscharacter(0)
> quit(save="no")

real 0m11.932s
user 0m4.100s
sys 0m0.110s

После второго запуска (я опускаю welcome-message программы R):
real 0m4.191s
user 0m4.060s
sys 0m0.070s

real, понятно, и должен быть меньше, поскольку все библиотеки уже загружены в память.

Следующий этап: перезагрузка, и то же самое с /usr в виде линка на usr с раздела-снимка (т.е. фрагментация та же, но диск уже новый).

Первый запуск:
real 0m6.726s
user 0m4.080s
sys 0m0.110s

Второй:
real 0m4.237s
user 0m4.040s
sys 0m0.060s

За счет более быстрого диска имеем внушительное ускорение первого запуска и практически неизменный - второй. В принципе, ничего удивительного.

И третий опыт, перезагрузка и копия подмонтирована в качестве /usr (т.е. раздел на новом диске, дефрагментированный подручными средствами):

Первый запуск:
real 0m5.613s
user 0m4.040s
sys 0m0.160s

Второй:
real 0m4.149s
user 0m4.050s
sys 0m0.050s

Вывод таков. Разумеется от дефрагментации польза есть, но она не настолько велика ( учитывая в каком состоянии файловая система находилась у меня до этого - 300 обрывков на 8 мегабайтном файле), чтобы лишний раз париться с дефрагментацией.
LinkLeave a comment

Comments:
From:(Anonymous)
Date:January 9th, 2008 - 02:54 pm
(Link)
Лучше бы автор проверил действие дефрагментации при загрузке системы - вот где время загрузки показывает себя. Кроме того, забыта возможность виндовых "дефрагментаторов" оптимизировать расположение файлов в системе - наиболее читаемые в начале, наиболее записываемые в конце, что тоже приводит к росту скорости. Плюс только после дефрагментации возможно изменение размеров раздела, если сильно фрагментировано свободное место. Плюс дефрагментация способствует ручному восстановлению файлов, "если что", и частично - автоматическому - программе проце работать. Плюс дефрагментация + оптимизация способствует уменьшению передвидения головок, что снижает шум и тепловыделение. Плюс...плюс...плюс...одним словом, от дефрагментации один плюс.
[User Picture]
From:[info]geekkoo
Date:January 9th, 2008 - 05:17 pm
(Link)
Трудно сказать, лучше бы это было или хуже. Слишком много случайно меняющихся параметров - то диск чекится, то ldconfig обновляется, то шрифты кэшируются. Тем более, что практически все используемые при загрузке программы лежат на /, который не слишком весело перекидывать с диска на диск. С /usr как-то спокойнее - "не поднялся, ну и фиг с ним"...

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

Как раз это спорный вопрос. В многопользовательской среде трудно предсказать какой файл будет читаться, записываться и в какой именно момент это будет происходить, тем более что общение с дисками давно уже асинхронное. Есть также такое парадоксальное мнение, что на загруженных уеб серверах лучше иметь немаленький процент фрагментации - процентов этак 10-20. Дескать тогда несколько десятков апачей быстрей раздают файлы пользователям.
From:(Anonymous)
Date:October 27th, 2008 - 08:37 pm

Дефрагментация - это однозначный плюс по быстродейств

(Link)
Хороша дефрагментация или плоха? Для ответа надо задать ещё один вопрос - для кого?
Постройте тест на замере скорости создания и заполнения файлов. Вариантов несколько: Создаем БОЛЬШОЙ (100Гигов) файл и записываем его рандомными числами. Создаем средний файл (ну скажем чуть больше кэша диска - скажем 50мб), и заполняем его рандомом. И создаем мелкий файл - скажем 512кб. Для чистоты эксперимента кол-во мелких файлов надо увеличить до общего объема в 100гигов (что бы они были одинаковы) - затем проверяем скорост чтения содержимого этих файлов. Время записываем в две колонки.
Аналог тестов CrystalDriveMark. Так у меня на NTFS на чистом разделе у больших файлов скорость составляет более 80МБ/сек. На фрагментированном (там где винда и темп, плюс даунлоад от торрента) скорость падает до 30МБ/с.
Теперь представьте (это поклонникам многозадачности) - что у вас есть отдельный винт - и вы храните на нем загруженное с торрента,аудио,видео,фото или просто рабочие проекты. Фрагментация этого диска растет. Фактически доступ к нему экслкюзивный (например, когда вы играете или правите что-то в гимпе или в аудасити у вас :) торрент не качает) - производительногость фрагментированного и дефрагментированного диска скажется просто офигенно как :) Со всеми вытекающими - включая общий пробег позиционирования головок на перемещения с цилиндра на цилиндр.
[User Picture]
From:[info]geekkoo
Date:October 29th, 2008 - 12:22 pm
(Link)
Я мало чего понял из вашего текста, но у меня есть несколько замечаний.

>>На фрагментированном (там где винда и темп, плюс даунлоад от торрента) скорость падает до 30МБ/с

Вам не кажется, что ситуация не симметрична? Одно дело измерять скорость (тем более скорость записи, а не чтения, которую измерял я) на отдельном диске, а другое - на диске, который активно используется системой ("винда и темп"), а также активными демонами ("плюс даунлоад от торрента").

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

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

Я уж молчу про рэйды со страйпом...