Linux Ext4: миллионы файлов в папке

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 29 сен 2019.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет. Имеется папка, в которой лежат миллионы файлов. Если важно - это фотки на сайте. Есть мнение, что держать такое количество файлов в одной папке (плоским списком, без вложений) - не труъ. На многих сайтах можно увидеть, что урлы на кртинки имеют вид типа /images/37/12/8472746723.jpg

    То есть, вместо того чтобы складывать весь миллион картинок в папку /images, в папке создается, например, 1000 других папок, и картинки уже раскладываются по ним, и тогда в каждой отдельновзятой папке будет порядка 1000 картинок.

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

    1. Действительно ли есть смысл разбивать большую свалку файлов на дерево папок? Если да, то почему (с технической точки зрения)?

    2. Если да, то какой разумный лимит сверху на количество папок и количество файлов в одной папке? ФС - Ext4.

    3. Сам для себя пока что сделал так: один дополнительный этаж из 4096 папок, и в них уже картинки. Имя файла - md5, имя папки, в которой он лежит - первые три символа его md5. То есть пути выглядят так: /images/959/9594efd8a45a95249c93008526f14137.jpg. Самих корневых папок (с 4096 дочерними в каждой) - 3-4 штуки. Такое норм?
     
    Последнее редактирование: 29 сен 2019
  2. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    999
    1. А что будет во время выдачи отфильтрованной выборки? какие расходы по времени и по поглащаемой оперативке? Эти миллионы как беруться, разом или через ленивость?
    2. Метод который будет обходить рекурсивный? что будет со стэком?
    3. А что в замерах время\память?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q2e74, итерирование (перебор, запрос списка) - это все делается раз в год по админско-вебмастерским нуждам. Даже если эта работа будет жрать слишком много ресурсов - это не страшно, поскольку это делается очень редко и обычно одним человеком. Интересует прежде всего прямой доступ по абсолютному пути - сохранение новой картинки или чтение существующий - то есть юзерские операции. Обход, фильтрация - это все юзерам не нужно.

    Что касается замеров - в вебе обычно так получается, что одни и те же казалось бы одинаковые действия дают очень разный результат при синтетических тестах и под реальной нагрузкой. И это не та проблема, которую хочется решать по мере ее возникновения :)

    Еще вопрос вдогонку: возможно различные подходы к организации папок имеют разную надежность в смысле восстановления данных, если вдруг что-то пошло не так, или, скажем, винт начал сыпаться? У меня на серваке зеркалирующий software RAID на два винта. Возможно это важно.
     
  4. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Добрый день.
    Это не мнение, а суровая реальность. Хотя лично я начал делить файлы на иерархию по другой детской причине: ФТП отказывается адекватно работать. Однако.
    https://habr.com/ru/post/157613/
    Так что на лицо тонкости реализации. Яркий пример того, как одни кривые руки приводят к необходимости создавать новые костыли.

    Такие дела (с)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Edmond, привет. Как ты в итоге сделал для себя? Сколько папок на этаж, и сколько этажей? И какая ФС?
     
  6. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.082
    Ты знаешь там ещё опции играют роль. И флаги когда mkfs делаешь. И флаги монтирования тоже.
    Поищи как настроить ext4 под много мелких файлов.
    --- Сообщение объединено, 3 окт 2019 ---
    Во:
    "
    Создание файловой системы

    Для маленьких файлов:

    mkfs -t ext4 -m 0 -O dir_index,filetype /dev/vg_name/vol
    tune2fs -o journal_data_writeback /dev/vg_name/vol

    Для больших файлов:

    mkfs -t ext4 -m 0 -T largefile4 -O extents,filetype,has_journal,sparse_super /dev/vg_name/vol
    tune2fs -o journal_data_writeback /dev/vg_name/vol
    "
     
  7. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Думаю самое главное это чтоб файлы не были фрагментированны. Это может повлиять на время чтения.
     
  8. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Имеет смысл. Это положительно сказывается на времени поиска файла в каталоге. Большинство файловых систем хранят каталоги как просто список dirent'ов. Соответственно, для поиска файла надо делать последовательное чтение каталога. Большое количество dirent'ов - дольше чтение - дольше время открытия файла.

    Практика показала, что хранение в одном каталоге больше 10000 файлов начинает сильно сказываться на производительности.

    Малоэффективно. Лучше не генерировать md5, а завести какой-то последовательный счётчик (или псевдорандомный, как результат умножения последовательного на простое число (4-5 десятичных знаков)), форматировать его значение в десятичном или шестнадатеричном виде фиксированной длины и бить уже это значение как строку по три символа, начиная с хвоста.
     
    q2e74 нравится это.
  9. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.082
    Садко.
    1.Тогда пользователю надо будет находить нужную папку, в дереве папок? Или как? Компуктер же одинаково будет искать.
    Только папок больше будет, дополнительная нагрузка???

    2.Если в консольном режиме, на экст4 вроде не должно сказываться. Когда были Экст2 и 3,
    тогда писали специальные ФС, под сервера. А на экст4 (если я не ошибаюсь), уже делают файловые хранилища.
     
  10. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Что проще для вас - начать читать книгу с начала, пока вы не найдёте нужную главу, или посмотреть в оглавление, сразу открыть книгу на нужной странице?
    Для большой книги очевидно лучше способ 2. Для рассказа на пару страниц сгодится и способ 1.
    А учитывая то, что компьютер чаще всего работает по алгоритму 1, то вывод можно сделать простой: минимизировать единовременно прочитываемый объём данных.

    Все файловые системы работают примерно по одному и тому же принципу. Отличие только в наличии дополнительных механизмов.
    Насколько помню, конкретно ext* файловые системы чувствительны к количеству файлов в каталоге, при этом XFS - нет.
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    В ext4 используется hashed b-tree, время поиска файла выражается O(log n), то есть логарифмическое время. В википедии хорошо сказано:
    https://ru.wikipedia.org/wiki/Временная_сложность_алгоритма
    То есть влияет ли число файлов в папке на время доступа к каждому в ext4 - да, влияет. Сильно ли влияет - теоретически не сильно, точно не пропорционально числу файлов. Что такое мнение - тезис, не подкрепленный аргументом. А прежде чем решать проблему, лучше сначала убедиться, что она есть.
     
  12. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    f13nd, хорошее замечание.
    https://en.wikipedia.org/wiki/HTree
    Есть в том числе и на ext3, и на ext2 (но не включено по умолчанию).
    Это действительно может ускорить открытие. Однако с просмотром каталога могут возникнуть проблемы. Файловым менеджерам типа mc уже на 10к записей начинает крышу сносить.
    Поэтому, _DEN_, если хотите универсальное решение, то лучше всё же построить иерархию.