Максимальное количество файлов/каталогов в Linux?

Я разрабатываю интернет-магазин LAMP, который позволит администраторам загружать несколько изображений для каждого товара.

Меня беспокоит то, что сразу будет 20000 элементов, что означает примерно 60000 изображений.

Вопросы:

  1. Каково максимальное количество файлов и/или каталогов в Linux?

  2. Как обычно поступают в этой ситуации (лучшая практика)?

Моя идея состояла в том, чтобы создать каталог для каждого элемента на основе его уникального идентификатора, но тогда у меня по-прежнему будет 20000 каталогов в основном каталоге uploads, и он будет расти бесконечно, поскольку старые элементы не будут удалить.

Спасибо за любую помощь.


person CodeVirtuoso    schedule 23.11.2011    source источник


Ответы (5)


файловые системы ext[234] имеют фиксированное максимальное количество инодов; для каждого файла или каталога требуется один индексный дескриптор. Вы можете увидеть текущее количество и ограничения с помощью df -i. Например, в файловой системе ext3 размером 15 ГБ, созданной с настройками по умолчанию:

Filesystem           Inodes  IUsed   IFree IUse% Mounted on
/dev/xvda           1933312 134815 1798497    7% /

В частности, помимо этого ограничений на каталоги нет; имейте в виду, что для каждого файла или каталога требуется как минимум один блок файловой системы (обычно 4 КБ), даже если это каталог, содержащий только один элемент.

Однако, как видите, 80 000 инодов вряд ли будут проблемой. А с опцией dir_index (включается с помощью tune2fs) поиск в больших каталогах не представляет большой проблемы. Однако обратите внимание, что многим административным инструментам (таким как ls или rm) может быть трудно работать с каталогами, в которых слишком много файлов. Таким образом, рекомендуется разделить ваши файлы так, чтобы у вас не было более нескольких сотен или тысяч элементов в любом заданном каталоге. Простой способ сделать это — хешировать любой идентификатор, который вы используете, и использовать первые несколько шестнадцатеричных цифр в качестве промежуточных каталогов.

Например, предположим, что у вас есть идентификатор элемента 12345, а его хэш равен 'DEADBEEF02842.......'. Вы можете хранить свои файлы под /storage/root/d/e/12345. Теперь вы сократили количество файлов в каждом каталоге на 1/256.

person bdonlan    schedule 23.11.2011
comment
Я знаю, что это старый пост ... но после некоторого копания не смог найти ничего приличного. Существует ли определенный метод хеширования, который позволит вам ожидать, что определенные буквенно-цифровые символы смогут хранить их в отдельных папках? - person Jish; 31.07.2013
comment
@Джиш, я тебя не понимаю. Вы можете использовать любую хэш-функцию, преобразовать ее результат в шестнадцатеричный формат и взять первые две шестнадцатеричные цифры. Тогда в идеале у вас будет равное распределение между [0-9a-f] для обеих цифр. - person glglgl; 24.10.2013
comment
Я только что создал около 150 000 файлов в каталоге, но команда ls не смогла вывести их список с помощью команды ls myfile*. Но так как я знаю имя файла, я попытался открыть первый и последний файл. Так что я знаю, что файлы существуют. - person Chan Kim; 28.10.2016

Если в файловой системе вашего сервера включена функция dir_index (подробности о проверке и включении этой функции см. в разделе tune2fs(8)), то вы можете разумно хранить более 100 000 файлов в каталоге до того, как производительность снизится. (dir_index используется по умолчанию для новых файловых систем в большинстве дистрибутивов уже несколько лет, поэтому это будет только старая файловая система, в которой эта функция не включена по умолчанию.)

Тем не менее, добавление еще одного уровня каталога для уменьшения количества файлов в каталоге в 16 или 256 раз значительно повысит шансы на то, что такие вещи, как ls *, будут работать без превышения максимального размера ядра argv.

Как правило, это делается примерно так:

/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...

то есть добавление буквы или цифры к пути на основе некоторой функции, которую вы можете вычислить по имени. (Первые два символа md5sum или sha1sum имени файла — это один из распространенных подходов, но если у вас есть уникальные идентификаторы объектов, то 'a'+ id % 16 — достаточно простой механизм для определения того, какой каталог использовать.)

person sarnold    schedule 23.11.2011

60000 ничего, 20000 тоже. Но вы должны сгруппировать эти 20000 любым способом, чтобы ускорить доступ к ним. Может быть, в группах по 100 или 1000, взяв номер каталога и разделив его на 100, 500, 1000, как угодно.

Например, у меня есть проект, в котором файлы имеют номера. Я группирую их по 1000, поэтому у меня есть

id/1/1332
id/3/3256
id/12/12334
id/350/350934

На самом деле у вас может быть жесткое ограничение - некоторые системы имеют 32-битные индексы, поэтому вы ограничены числом 2 ^ 32 на файловую систему.

person glglgl    schedule 23.11.2011
comment
При настройках mke2fs по умолчанию вам потребуется несколько десятков терабайт дискового пространства, прежде чем вы начнете иметь достаточно места для 2 ^ 32 инодов в таблицах инодов :) - person bdonlan; 23.11.2011
comment
подождите несколько лет, и мы там... :-) - person glglgl; 23.11.2011
comment
ждали... и вот мы здесь - person Yarek T; 24.04.2020

В дополнение к общим ответам (в основном «не беспокойтесь так сильно» и «настройте свою файловую систему» ​​и «организуйте свой каталог с подкаталогами, содержащими несколько тысяч файлов каждый»):

Если отдельные изображения небольшие (например, меньше нескольких килобайт), вместо того, чтобы помещать их в папку, вы также можете поместить их в базу данных (например, с помощью MySQL в виде файла BLOB) или, возможно, внутри GDBM проиндексированный файл. Тогда каждый маленький элемент не будет потреблять индексный дескриптор (во многих файловых системах каждому индексному дескриптору требуется как минимум несколько килобайт). Вы также можете сделать это для некоторого порога (например, поместить изображения размером более 4 КБ в отдельные файлы и меньшие в базу данных или файл GDBM). Конечно, не забудьте сделать резервную копию ваших данных (и определить стратегию резервного копирования).

person Basile Starynkevitch    schedule 23.11.2011
comment
Это хороший механизм для сокращения использования диска, но он предотвращает механизмы нулевого копирования, такие как sendfile(2) для передачи файлов без дальнейшего вмешательства серверного программного обеспечения. - person sarnold; 24.11.2011

Год 2014. Я возвращаюсь вовремя, чтобы добавить этот ответ. Много больших/маленьких файлов? Вы можете использовать Amazon S3 и другие альтернативы, основанные на Ceph, такие как DreamObjects, где не нужно беспокоиться об ограничениях каталогов.

Я надеюсь, что это поможет кому-то выбрать из всех альтернатив.

person Abhishek Dujari    schedule 26.03.2014
comment
Ах, какая ирония... Я читаю эту ветку именно потому, что загрузил журналы AWS CloudTrail за 2 месяца из-за отсутствия лучшего способа их использовать. Кажется, около 300 файлов json в день. Умножить на 60 дней. У меня около 18 000 файлов, и я их все закинул в один и тот же каталог. Мораль истории: на дворе 2014 год, и волшебные облачные сервисы создают кучу новых проблем взамен решенных. - person David; 23.04.2014
comment
Вы можете использовать других провайдеров CDN, которые могут предоставлять журналы в формате W3C. Я нашел кучу примеров кода и объединил их, чтобы создать то, что мне нужно. Затем передайте их, например, в AWStats, чтобы получить мою статистику. Любой кодер, который хоть наполовину так серьезен, может добиться этого. Достаточно сказать, что Object store — это не панацея, но для упомянутой выше проблемы — хорошее решение в 2014 году. - person Abhishek Dujari; 15.10.2014