Максимальное количество файлов / каталогов в Linux? - PullRequest
48 голосов
/ 23 ноября 2011

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

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

Вопросы:

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

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

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

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

Ответы [ 6 ]

74 голосов
/ 23 ноября 2011

ext [234] файловые системы имеют фиксированное максимальное число inode;для каждого файла или каталога требуется один индекс.Вы можете увидеть текущий счет и ограничения с 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/25.

8 голосов
/ 23 ноября 2011

Если в файловой системе вашего сервера включена функция 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 является достаточно простым механизмом для определения, какой каталог использовать.)

6 голосов
/ 23 ноября 2011

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

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

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

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

4 голосов
/ 23 ноября 2011

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

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

1 голос
/ 26 марта 2014

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

Надеюсь, это поможет кому-то определиться со всеми альтернативами.

0 голосов
/ 28 апреля 2014
md5($id) ==> 0123456789ABCDEF

$file_path = items/012/345/678/9AB/CDE/F.jpg 

1 node = 4096 subnodes (fast)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...