我正在开发一个LAMP在线商店,允许管理员为每个商品上传多张图片。
我的担忧是 - 刚开始就会有20000项商品,大约需要60000张图片。
问题:
Linux上的最大文件和/或目录数是多少?
处理这种情况的常规方式是什么(最佳实践)?
我的想法是为每个商品创建一个基于其唯一ID的目录,但这样仍然会在主“uploads”目录中拥有20000个目录,并且随着旧商品不被删除,它将无限增长。
感谢任何帮助。
我正在开发一个LAMP在线商店,允许管理员为每个商品上传多张图片。
我的担忧是 - 刚开始就会有20000项商品,大约需要60000张图片。
问题:
Linux上的最大文件和/或目录数是多少?
处理这种情况的常规方式是什么(最佳实践)?
我的想法是为每个商品创建一个基于其唯一ID的目录,但这样仍然会在主“uploads”目录中拥有20000个目录,并且随着旧商品不被删除,它将无限增长。
感谢任何帮助。
ext[234]文件系统有固定的最大inode数量;每个文件或目录都需要一个inode。您可以使用df -i
查看当前计数和限制。例如,在使用默认设置创建的 15GB ext3 文件系统上:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda 1933312 134815 1798497 7% /
对于目录的数量,没有特定的限制,但请记住即使是只有一个项目的目录也需要至少一个文件系统块(通常为4KB)。
虽然你可以看到,80000个索引节点不太可能成为问题。并且通过启用tune2fs
命令中的dir_index
选项,大型目录的查找不会太麻烦。但是,请注意许多管理工具(例如ls
或rm
)在处理文件太多的目录时可能会有困难。因此,建议将文件拆分,以便任何给定目录中不超过几百到一千个项目。一种简单的方法是对使用的ID进行哈希处理,并使用前几个十六进制数字作为中间目录。
例如,假设你有项目ID 12345,并且它的哈希值为'DEADBEEF02842.......'
。你可以将文件存储在/storage/root/d/e/12345
下。现在,你已经将每个目录中的文件数量减少了1/256。
dir_index
功能(参见tune2fs(8)
以了解如何检查和开启该功能),那么在一个目录中存储超过10万个文件是可以的,直到性能开始下降。(大多数发行版的新文件系统默认都开启了dir_index
,因此只有旧文件系统才可能没有默认启用该功能。)ls *
这样的操作的成功几率,并避免超出内核的最大argv
大小。/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...
即,在路径前面加上一个字母或数字,基于一些你可以从名称计算出来的特征。(文件名的md5sum
或sha1sum
的前两个字符是一种常见的方法,但如果你有唯一的对象ID,那么'a'+ id % 16
是足够简单的机制来确定使用哪个目录。)
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个数。
sendfile(2)
这样的零拷贝机制,从而无需进一步的服务器软件干预即可传输文件。 - sarnold我同意这个评论,云计算确实带来了一些新问题,但你必须正确使用它,适合适当的工作类型,而不是抛弃它。
md5($id) ==> 0123456789ABCDEF
$file_path = items/012/345/678/9AB/CDE/F.jpg
1 node = 4096 subnodes (fast)
[0-9a-f]
范围内获得相等的数字分布。 - glglgl