5/19/2008

Дефрагментаторы для Linux

О фрагментации данных в файловых системах и её влиянии на производительность уже говорилось, a теперь несколько слов и том, какие есть дефрагментаторы для Линукс. Их немного, и в составе дистрибутивов их, как правило, нет. Время выяснить, почему.


Что удалось найти
Итак, беглый обзор того, что есть в Линукс для дефрагментирования - и нашлось две утилиты, defrag и shake. Утилита defrag от Кона Коливаса, похоже, больше не развивается - последняя версия датируется 2005 годом, зато есть shake, который умеет дефрагментировать отдельные каталоги.

Так же есть полезный скрипт, позволяющий измерить фрагментацию frag.perl, код которого можно взять тут. На всякий случай дублирую его здесь:
#!/usr/bin/perl -w

#this script search for frag on a fs
use strict;

#number of files
my $files = 0;
#number of fragment
my $fragments = 0;
#number of fragmented files
my $fragfiles = 0;

#search fs for all file
open (FILES, "find " . $ARGV[0] . " -xdev -type f -print0 |");

$/ = "\0";

while (defined (my $file = )) {
open (FRAG, "-|", "filefrag", $file);
my $res = ;
if ($res =~ m/.*:\s+(\d+) extents? found/) {
my $fragment = $1;
$fragments += $fragment;
if ($fragment > 1) {
$fragfiles++;
}
$files++;
} else {
print ("$res : not understand for $file.\n");
}
close (FRAG);
}
close (FILES);

print ( $fragfiles / $files * 100 . "% non contiguous files, " . $fragments / $files . " average fragments.\n");
Скрипт выводит данные о фрагментации для указанного каталога:
sudo ./frag.pl /root
3.2258064516129% non contiguous files, 1.04838709677419 average fragments.
С помощью последних двух утилит мы и будем бороться с фрагментацией в Линукс.


Установка
Если вы хотите заполучить дефрагментатор под Линукс - shake вам в этом поможет. А ещё поможет гугл, терпение и настойчивость, потому как процесс установка shake не для слабонервных.

Для этого идём сюда и скачиваем исходник (или бинарник, если у вас Ubuntu Gutsy Gibbon). В случае с бинарником его нужно только поставить, а исходник надо собирать. И тут начинаются приключения...

Во-первых, последние версии просят новой версии cdbs, поэтому пришлось откатиться на старую версию. Для сборки нужны пакеты:
dpkg-checkbuilddeps: Unmet build dependencies: cdbs (>= 0.4.50) cmake (>= 2.4) help2man (>= 1.26) libattr1-dev (>= 2.0.0)
Сама программа собралась, как и её вспомогательная утилита unattr. Чтобы использовать shake на всю мощь, очень желательно смонтировать файловую систему с опцией user_xattr - для этого редактируем /etc/fstab и правим:
/dev/sda2 /mnt/flash/exthdd ext3 rw,user_xattr,user,auto 0 0
После чего перемонтируем: mount -o remount /dev/sda2
Установка user_xattr не обязательна, но рекомендуется, так как программа с ней будет работать быстрее.

Последнее замечание: обе утилиты - shake и frag.perl - требуют рутовых прав, так что их запускаем через sudo.


Пример
Итак, я скачивал на переносной винчестер репозитории Харди Хирон (на винчестере, естественно, ext3). Скачивал в несколько заходов, попутно перенося много данных между компьютерами - условия для фрагментации самые благоприятные. Запускаю оценку фрагментированности:
./frag.perl /home/beast/flash/exthdd/linux/i386/ubuntu/pool/main 0.795800880460549% non contiguous files, 1.00998984083982 average fragments.
Ну, на 22Гб в общем-то не катастрофа, скажем прямо. Но уж раз она есть, значит будем бороться. Для этого запустил shake:
./shake /home/beast/flash/exthdd/linux/i386/ubuntu/pool/main
Программа начала дефрагментацию, и через 15-20 секунд закончила. Для уверенности сравнил MD5-суммы всех файлов - всё совпадает. Можно переходить к более масштабным экспериментам на собственных данных.


Масштабный эксперимент
Итак, для эксперимента попробуем дефрагментировать что-то действительно важное, например профиль Firefox. Исходные данные: профиль Firefox 2.0.0.4, файловая система ReiserFS, ноутбук Asus M5200AE (P-M 1.75, 512Mb RAM).

Файлов много, а так как у меня огромная коллекция сайтов в Scrapbook, то фрагментация там должна быть большой. Оценка показывает:
./frag.perl /home/beast/.mozilla/
3.24491439557299% non contiguous files, 1.12239224753839 average fragments.
Следует сказать, что Firefox у меня обвешан плагинами и темами, как новогодняя кремлёвская ёлка. Запускается с холодного старта он дооооолго:
time /opt/firefox2/firefox
real 0m40.467s
user 0m5.389s
sys 0m0.407s

time /opt/firefox2/firefox
real 0m41.383s
user 0m5.453s
sys 0m0.403s
Запускал два раза, каждый раз компьютер перезагружался. В общем, около 41 секунды.

После этого проведена дефрагментация shake, которая длилась 9 минут. Ещё две перезагрузки для того, чтобы получить цифры запуска Огнелиса с "холодного старта". Они, в общем, не впечатлили:
time /opt/firefox2/firefox
real 0m39.522s
user 0m5.398s
sys 0m0.374s

time /opt/firefox2/firefox
real 0m39.214s
user 0m5.279s
sys 0m0.370s
Теперь запуск длится около 39 секунд. Выигрыш - 2 секунды.

Выводы
Я, конечно, могу ещё что-нибудь подефрагментировать, но боюсь, что результат будет тот же самый: существенного влияния (во всяком случае на ReiserFS) дефрагментация не производит. Это же подтверждают здесь, где тоже приведён пример с shake.

В общем, если долгими зимними вечерами делать особенно нечего, всё скомпилировано и работает - можно попробовать всё это дефрагментировать.

19 комментариев:

  1. В Gentoo shake присутствует в портежах и не требует никаких дополнительных действий по установке, кроме размаскирования (~x86) и emerge shake.


    Вот, что у меня получилось на reiserfs:
    du -h /data/distfiles/ Дает размер файлов 3.8G
    # ./frag.pl /data/distfiles/
    21.978021978022% non contiguous files, 1.56272893772894 average fragments.

    # mount -o remount /data
    # shake /data/distfiles/
    ./frag.pl /data/distfiles/
    22.3901098901099% non contiguous files, 1.73946886446886 average fragments.

    Если верить скрипту, эффект обратный.

    ОтветитьУдалить
  2. Повторный запуск:
    # shake --old=0 --verbose /data/distfiles/
    ...
    # ./frag.pl /data/distfiles/
    21.7032967032967% non contiguous files, 1.98351648351648 average fragments.

    ОтветитьУдалить
  3. У вас скрипт неправильно вставился — в нём были угловые скобки, а Blogger их порезал.

    ОтветитьУдалить
  4. Я не фанат дефрагментаций, но тест с firefox немного некорректен. Неизвестно сколько из 40 секунд тратится на работу файловой системы, может быть 30, а может быть и 5.

    ОтветитьУдалить
  5. Кроме того дефрагментировали профиль, а запускали бинарник

    ОтветитьУдалить
  6. Есть еще утилитка gdavl - позволяет визуально оценить состояние ФС.

    ОтветитьУдалить
  7. Маленький офтопик. А может кто - нибудь пробовал Оперу? Она как мне показалось гораздо быстрее работает чем ФФ. Но так как я линуксом сейчас пользуюсь не часто и встает проблема о выборе браузера было бы интересно узнать что работает быстрее и с меньшими глюками. Насколько я знаю ФФ часто глючит особенно если в нем есть сторонние плагины, которы не так часто обновляются или я не прав.
    Еще раз извиняюсь за офтоп

    ОтветитьУдалить
  8. интересно сравнить данное исследование с двумя статьями: старой и новой

    ОтветитьУдалить
  9. 2 massalim пишет...
    интересно сравнить данное исследование с двумя статьями: старой и новой

    Ну мой пост это не исследование во всяком случае. Это два дефрагментатора :-)

    Но ссылки интересные, прочитал.

    Вывод в общем простой: если fsck показывает меньше 10% фрагментации (а это чаще всего так и есть) - ничего дефрагментировать не надо.

    ОтветитьУдалить
  10. А утилита shake - она ФС-независима? На ext3/ext4 работать будет? Интересно будет потестить. :)

    ОтветитьУдалить
  11. На Mint 9 shake не стал =((
    простите оффтоп: может кто знает как переконвертировать ntfs в ext4 не форматируя и не перемещая данные(занято 40 гиг из 58)? раздел остался от винды. либо предложите другой дефрагментатор, откушу по частям...*облизываясь*
    Спасибо

    ОтветитьУдалить
  12. Переконвертировать ... хе-хе при помощи gparted

    уменьшаешь размер раздела с ntfs
    в пустом месте создаешь новый на ext4
    переливаешь часть данных
    уменьшаешь NTFS
    увеличиваешь EXT4
    переливаешь данные
    ...
    PROFIT

    ОтветитьУдалить
  13. [soz@localhost ~]$ sudo sh frag.pl /soz
    frag.pl: line 2: use: команда не найдена
    frag.pl: line 5: my: команда не найдена
    frag.pl: line 7: my: команда не найдена
    frag.pl: line 9: my: команда не найдена
    frag.pl: line 12: syntax error near unexpected token `FILES,'
    frag.pl: line 12: `open (FILES, "find " . $ARGV[0] . " -xdev -type f -print0 |")

    В чем может быть дело?

    ОтветитьУдалить
  14. ОФФТОМ 2 Maverick, можете не читать.
    Опера реально стабильнее и шустрее фокса, ОСОБЕННО ЕСЛИ грамотно использовать и ОБЯЗАТЕЛЬНО настроить URL-фильтр для блокирования всяческого мусора. Однако если на странице много флэша - даже опера нагрузит машину не хуже фокса. Всё от пользователя зависит - я чищу сайты от мусора и у меня в опере два окна с пятью десятками вкладок (если не более), при этом общий размер оперы в RAM примерно 700 мегабайт и нагрузка на проц 4-14% при условии наличия нескольких флэш-элементов. Летает шустро, фокс слёг бы от половины такой нашрузки. Стартует опера дооолго...

    ОтветитьУдалить
  15. Поправьте пожалуйста скрипт, на 18 строке парсер <FILES> вырезал.

    ОтветитьУдалить