Какую файловую систему и с каким настройками лучше использовать для очень большого количества маленьких файлов?
На диске сервера ожидается всего 60кк файликов. 15кк папок.
Структура: 4к папок, в каждой примерно по 3750 папок, в каждой по 4 файлика.
Файлики изначально по 15-20 байт. С течением времени будут расти по 0.6 килобайта в месяц на протяжении примерно 30 месяцев - диск на 1 терабайт.
Тестировал на данный момент xfs и ext3 - то что сейчас стояло на сервере на двух дисках.
ext3 - размер блока 4кб, диск намного более загружен данными.
xfs - размер блока 2кб
По скорости записи:
ext3 за 5 часов 20 минут - ~18.400.000 созданных файлов и папок.
xfs за 5 часов 20 минут - ~14.200.000 созданных файлов и папок.
Чем больше данных записано, тем быстрее падает скорость записи. Для xfs этот момент существенно хуже ext3, хотя и ext3 тоже очень не хорошо себя ведет.
По скорости первого чтения 50к папок с помощью php функий opendir и readdir:
ext3 - ~800 секунд
xfs - ~1200 секунд
По скорости чтения тех же 50к папок второй и последующие разы:
ext3 - 5секунд
xfs - 47 секунд
Но это только 50к папок. Если будут 15кк папок - то при ext3 полное первое считывание всех папок будет примерно за 66 часов. Надо за ~12. И боюсь, что повторное чтение не будет таким же быстрым, как в случае с 50к папками, потому что столько данных не будут хранится в кэше (или где они хранятся?) постоянно в полном объеме (или будут?). Даже если повторное и последующие считывания будут происходить уже очень быстро, то в случае ребута сервера опять надо 66 часов тратить на первое считывание. Так не подходит.
ext4 будет работать еще шустрее ext3 как я понимаю. Но врядли справится прочитать первоначально все 15кк папок за ~12 часов с помощью php функций opendir и readdir.
Как быть, может что-то посоветуете? ext4 намного шустрее по записи/ЧТЕНИЮ, чем ext3?
Какую файловую систему поставить протестировать, с каким настройками? Может есть другие варианты решения проблемы медленного чтения?
savage_me, На мой взгляд надо сделать доступ параллельным - разносить хранилище на разные экземпляры ФС и носители - очень высокие издержки на получение одного файла, которые усугубляются последовательным доступом к каждому объекту. Еще как разумно посоветовали в ответах - надо увеличить уровень вложенности каталогов и уменьшить количество объектов в каталогах.
мучался и тестировал на всех доступных фс, кроме рейзера так как он умер
пришлось остановиться на ext4 особо альтернатив нет для мелких файлов, хоть в базу их пихай, но в случае если вы их дописываете это не особо подойдет
так же рекомендую уменьшить и сделать три уровня папок вместо двух
так же структуру можно хранить в бд и не опрашивать папки на наличие в них других папок , то есть обращаться напрямую в файлы
по форматированию и монтированию использую сейчас что то типо такого
mkfs -t ext4 -m 0 -O dir_index,filetype /dev/vg0/lv0
tune2fs -o journal_data_writeback /dev/vg0/lv0
noatime,nodiratime,noacl,data=writeback,commit=15
производительность все равно оставляет желать лучшего, хочется просто самому сесть и написать базу данных для мелких файлов с офигенной производительностью