在Linux中存储和访问多达1000万个文件

Mat*_*att 30 linux performance ext4 xfs

我正在编写一个需要存储大约1000万个文件的应用程序.

它们目前以UUID命名,每个大约4MB,但总是相同.从/向这些文件读取和写入将始终是顺序的.

我正在寻找2个主要问题的答案:

1)哪种文件系统最适合这种情况.XFS还是ext4?2)是否有必要将文件存储在子目录下以减少单个目录中的文件数量?

对于问题2,我注意到人们已经尝试发现可以存储在单个目录中的文件数量的XFS限制,并且没有找到超过数百万的限制.他们注意到没有性能问题.在ext4下怎么样?

在人们做类似事情时,有些人建议将inode编号存储为文件的链接而不是文件的性能(这是在数据库索引中.我也在使用).但是,我没有看到用于按inode编号打开文件的可用API.这似乎更像是在ext3下提高性能的建议,我不打算顺便使用它.

ext4和XFS限制是什么?从一个到另一个有什么性能优势,你能看到在我的情况下使用ext4而不是XFS的理由吗?

Zan*_*ynx 20

您绝对应该将文件存储在子目录中.

EXT4和XFS都使用高效的文件名查找方法,但如果您需要在目录上运行工具,ls或者find您将非常高兴将文件保存在1,000到10,000个文件的可管理块中.

inode号是为了提高EXT文件系统的顺序访问性能.元数据存储在inode中,如果您不按顺序访问这些inode,则元数据访问将被随机化.通过以inode顺序读取文件,您也可以按顺序访问元数据.

  • @Matt无法通过inode打开文件(它会绕过部分Unix访问控制方案).但是`readdir`告诉你inode编号,所以你按inode编号对文件名列表进行排序,然后按顺序打开它们.顺便说一句,"`stat`很贵"是过于简单化了; 更准确的陈述是"`stat(f); open(f)`比"h = open(f); fstat(h)`"贵一些.(你避免在后者中做两次的昂贵操作case是*pathname processing*,而不是磁盘访问.差异曾经是2x,但对于现代系统应该更少.) (5认同)

Mar*_*rkR 11

如果您愿意,现代文件系统将允许您将1000万个文件存储在同一目录中.但工具(ls及其朋友)将无法正常工作.

我建议放一个级别的目录,一个固定的数字,可能是1000个目录,并将文件放在那里(10,000个文件可以容忍shell,"ls").

我已经看到了创建多级目录的系统,这确实是不必要的,并且增加了inode消耗并使遍历变慢.

10M文件也不应该是一个问题,除非你需要对它们进行批量操作.

我希望你需要修剪旧文件,但像"tmpwatch"这样的东西可能适用于10M文件.