Driver86
@Driver86
Немодератор toster.ru

Влияет ли кол-во файлов в директории на скорость записи (создания новых файлов) в ext4?

Влияет ли кол-во файлов в директории на скорость записи (создания новых файлов) в ext4?
Листинг не интересует.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Влияет, но смотря сколько файлов. Индексируются хеши файлов, поэтому довольно быстро можно найти файл.

Разница между 100 и 1000 файлов будет минимальна (менее процента)
Разница между 100 и 1.000.000 файлов будет немного заметна, но только пока блоки содержащие директорию не закешируются в памяти.

По сравнению с ext3, ext4 ОЧЕНЬ сильно оптимизировала работу с множеством файлов.

Ниже edo1h привел пример теста, но он некорректно использовал внешнюю команду, получив основную нагрузку на процессор, а не на диск. Мой комментарий вышел слишком длинный поэтому решил его в ответ добавить:
spoiler
Давайте померяем еще раз вашим скриптом, а потом более правильным:
$ test() { for A in `seq 1 10000`; do touch $RANDOM.$RANDOM.$A; done }

$ time test
real 0m8.406s
user 0m5.939s
sys 0m2.548s
$ time test
real 0m7.943s
user 0m5.699s
sys 0m2.333s
$ time test
real 0m7.929s
user 0m5.647s
sys 0m2.369s

Как мы видим, ничего особо не видно. Непонятно быстрее или медленнее. Вдобавок user time занимает основную часть времени и видимо сильно влияет на результат.

Перепишем скрипт:
$ test1() { for A in `seq 1 10000`; do echo "" > $RANDOM.$RANDOM.$A; done }
Почистим файлы и попробуем заново
$ rm -rf *
$ time test1
real 0m0.310s
user 0m0.111s
sys 0m0.196s

Сразу остановимся и увидим, что теперь у нас основное время это именно sys, а не user тайм, то есть уже чаще скрипт ждет пока выполнятся дисковые операции, а не дисковые операции ждут пока им дадут команду что-то делать. Повторим команду несколько раз:

$ time test1
real 0m0.331s
user 0m0.101s
sys 0m0.229s

$ time test1
real 0m0.331s
user 0m0.129s
sys 0m0.200s

$ time test1
real 0m0.402s
user 0m0.118s
sys 0m0.229s

$ time test1
real 0m0.324s
user 0m0.087s
sys 0m0.236s

$ time test1
real 0m0.382s
user 0m0.129s
sys 0m0.253s

$ time test1
real 0m0.387s
user 0m0.102s
sys 0m0.283s

$ time test1
real 0m0.421s
user 0m0.115s
sys 0m0.299s

$ time test1
real 0m0.465s
user 0m0.115s
sys 0m0.312s

$ time test1
real 0m0.465s
user 0m0.139s
sys 0m0.324s

$ time test1
real 0m0.467s
user 0m0.139s
sys 0m0.327s

$ time test1
real 0m0.553s
user 0m0.156s
sys 0m0.365s

$ time test1
real 0m0.560s
user 0m0.194s
sys 0m0.364s

Итоги: видно что кеширование где-то работает, но с каждыми новыми файлами тенденция к замедлению есть, и она всего лишь через несколько десятков тысяч файлов увеличилась почти в полтора раза.
То есть задолго до миллиона я получу замедление в несколько раз. Но это на моей виртуалке. На каждом оборудовании надо тестировать индивидуально.
Ответ написан
Комментировать
@edo1h
а взять и проверить сложно?
root@testserver:/test# test() { for A in `seq 1 10000`;  do touch $RANDOM.$RANDOM.$A; done }
root@testserver:/test# time test

real    0m5.772s
user    0m4.419s
sys     0m1.684s
root@testserver:/test# for A in `seq 1 100`; do test ; done
root@testserver:/test# time test

real    0m5.898s
user    0m4.495s
sys     0m1.817s


после записи в каталог миллиона файлов скорость создания новых файлов осталась той же
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы