k001
k001
:...
k001 [userpic]
directory lookup speedup howto, или как ускорить файловую систему

Если у вас система тормозит при попытке прочитать большой каталог, файлы в который добавлялись в очень разное время (типа /usr/bin) -- наверное, у вас не включена опция dir_index на файловой системе ext2/3/4. Типичный симптом: когда в почте хотите открыть вложение, вам предлагается выбрать программу, вы пишете /usr/bin -- и тут всё застревает секунд на 5-10. Это застревание можно частично починить включением вот этой самой опции dir_index.

Включить её не слишком просто, но, впрочем, не так уж и сложно. Хотя у вас, скорее всего, она уже включена инсталлятором системы. Но вдруг нет?

Для начала надо знать, на каком устройстве мы хотим включить dir_index, и хотим ли. К примеру, у меня это /dev/hda6 (узнать можно командой mount):

kir@note ~ $ mount
/dev/hda6 on / type ext3 (rw,noatime)
...


Теперь смотрим, есть ли там dir_index:

kir@note ~ $ sudo /sbin/dumpe2fs /dev/hda6 | head
dumpe2fs 1.41.2 (02-Oct-2008)
Filesystem volume name: gentoo
Last mounted on:
Filesystem UUID: 3945a162-6f56-4a66-b090-9dd1e4df9c87
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal dir_index filetype needs_recovery sparse_super large_file
Filesystem flags: signed_directory_hash
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue


Видите (в строчке Filesystem features) -- у меня уже есть dir_index. Если у вас нет -- этот текст для вас. Скорее всего, вам потребуется перезагрузиться. Вариант без перезагрузки тоже возможен, если файловая система, на которой вы хотите включить dir_index, не рутовая -- тогда достаточно будет или отмонтировать её, или хотя бы перемонтировать в read-only. Но этого вопроса я тут не касаюсь, чтобы статья не распухла совсем уж сильно.

Итак, перезагружаемся, видим экран загрузчика GRUB, выбираем в нём строчку с ядром, которое хотим загрузить, но вместо Enter нажимаем e (edit). Видим несколько строчек, выбираем стрелочками строчку со словом kernel и снова нажимаем e (edit). Дописываем в конец строчки слова init=/bin/bash (или /bin/sh, если у вас вдруг нет bash, или какой-нибудь другой shell), нажимаем Enter и далее b (boot). Грузится ядро и сразу запускает bash. Кстати, таким образом можно зайти в систему рутом, не зная рутового пароля (но, как вы понимаете, нужен физический доступ к компьютеру и перезагрузка).

Ещё помните, как у вас устройство называется? У меня /dev/hda6. Дальше всё просто.

Делаем раз: выставляем опцию dir_index:
# /sbin/tune2fs -O +dir_index /dev/hda6

Делаем два: проверка ФС с созданием индексов (опция -f -- force, опция -D -- оптимизировать каталоги, создавать индексы, опция -С 0 -- показывать прогресс):
# e2fsck -f -D -C 0 /dev/hda6

На этом месте можно откинуться на спинку кресла пойти попить чаю. А после того, как всё закончится, по старой юниксовой традиции пишем
sync
sync
reboot


Собственно, всё. Enjoy.

Tags: ,
Comments

это ж сколько должно быть файлов чтоб случилось "застревает секунд на 5-10"?

У меня только что файрфокс секунд на 40 задумался, когда я предложил ему сохранить файл в /usr/bin/ :)
Причём dir_index включен.

dir_index, конечно, не панацея, но попробовать e2fsck -f -D -C 0 /dev/?da? можно

Похоже что файрфокс что-то странное делает.
Список файлов-то он получает достаточно быстро. А потом каждый открывает, читает оттуда сколько-то байт, закрывает. Потом много раз дёргает gettimeofday.
Я так понимаю что если бы проблема была в индексах, то он бы именно список файлов долго получал?

Никак тыкает в каждый файл file(1)’ом, дабы определить mime type и показать правильную иконку?

Похоже на то. Вот только файлы-то он все не показывает, только html-ные, и папки. Т.е. делает абсолютно бессмысленную работу.

Ну так, по идее, чтобы определить, что файл — text/html, нужно его потыкать узнать, что он такое есть, и сравнить с "text/html" :)

Вот нет чтобы тупо смотреть по расширению :))

Попробовал натравить firefox на /usr/bin, лежащую на рейзере. Открывало минуты две. Задумался...

С рейзером даже и не подскажу, что делать. Снести нафиг? :)

> натравить firefox на /usr/bin, лежащую на рейзере.

> Открывало минуты две. Задумался...

У меня /usr на reiserfs, всё шустро.

P. S. Тут следует заметить, что прямая связь между тормозами в таких программах как Firefox, и файловой системой, далеко не очевидна — тот же ls -l /usr/bin выполняется гораздо быстрей.

> /usr/bin -- и тут всё застревает секунд на 5-10

Ммм, а почему ты думаешь, что эти тормоза обусловлены состоянием FS? А если тот-же

time ls -l /usr/bin > /dev/null

покажет совсем другие цифры?

Re: > /usr/bin -- и тут всё застревает секунд на 5-10

Кстати да, это проходит быстро:
$ time ls -l /usr/bin > /dev/null

real 0m0.052s
user 0m0.024s
sys 0m0.020s

А файрфокса надо будет пострейсить, чего-то он ещё кажется делает.

В очередной раз спасибо.

Очень полезно. Спасибо.