大量微小文件的文件系统寻址性能

3
我想要构建一个服务器,通过XML API提供大量的小文件。它不会在目录或连续文件块之间进行大量迭代——我们需要大量的不连续数据查找。
对于单个文件请求,BSD UFS的寻址时间是否会随着时间的推移而降低?我了解到,文件系统的inode限制是基于分区/切片的大小,但硬盘在发现数据位置之前必须为每个文件请求遍历inode表。哪种文件系统的寻址性能最佳?
另一种选择是设置2-4GB的“blob”文件,并且从软件内部寻找包含在其中的文件的单独系统。基于当前登录用户等因素,软件的“inode表”可以针对交付进行优化...这些“inode表”可能会被缓存在RAM中,并且只与当前已登录的用户相关联,以减少浪费的资源。
这两种解决方案在可扩展性和维护方面如何评价?如果使用第二种解决方案,可以期望获得什么样的性能收益(如果有)?
5个回答

5

最明显且历经时间考验的缓解技术是使用良好的目录分层设计(以及路径名搜索策略),并拥有更多的目录,每个目录中包含较少的文件。


3

对于最近的FreeBSD版本,使用dirhash和softupdates,我在每个目录中看到了数万个文件没有问题。你可能不想超过500,000个文件。例如,删除一个包含2,500,000个文件的目录花费了我三天的时间。


哎呀!那是一个漫长的删除操作。我敢打赌,整个过程中机器都无法使用了。 - Nolte
不,机器实际上运行良好,并通过SMB向40多个用户提供文件服务。 - max

1
我不确定我正确理解了你的问题,但如果你想查找大量文件,为什么不使用分区的mysql表格,放置在RAID0或VFS文件系统上呢?
编辑:据我所知,一个文件夹中有很多文件会降低任何文件系统的速度,因为它必须维护更大的文件列表、权限和名称,而数据库则是专门设计用来将数据列表保持在内存中,并以非常优化的方式查询它。

0

提供更多您的情况细节将会有所帮助,这些文件是已经存在还是由您的应用程序创建的?如果您需要一种在没有关系型数据库结构的情况下存储任意数据的方式,您是否看过对象数据库


这些将是新文件。 我方法的两个目标是最小化文件查找时间和尽可能简单高效地进行备份。 - Nolte

0

如果您的对象应该或可以通过HTTP访问,则另一个选择是在小型Web服务器前使用 varnish缓存。最初,对象将存储在磁盘上,但是在第一次访问给定对象后,varnish将从内存中存储和提供对象。


我们已经通过Squid缓存HTTP请求了。不过还是谢谢你的建议 :) - Nolte
Varnish更擅长将所有内容保存在内存中,因此您很少会遇到文件系统问题。当它确实发生时,它使用自己的虚拟内存格式,因此您不会遇到目录大小限制。 - wulong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接