我们正在构建一个可能会生成非常大的 XFS 卷的产品,并且我正在尝试发现给定架构我们可能遇到的扩展瓶颈。
当我们操作文件时,它们被放置在 XFS 卷上的目录中。由于我们处理的文件数量,文件数肯定在数千万级,并且在发布后不久可能会达到数亿级。我们知道这一点是因为我们当前的产品以这种方式运行,因此有理由期望我们的下一个产品也这样做。
因此,正确的早期工程是有序的。
本周的文件基于以下粗略布局:
$ProjectID/$SubProjectID/[md5sum chunked into groups of 4]/file
它给出的目录看起来有点像:
0123456/001/0e15/a644/8972/19ac/b4b5/97f6/51d6/9a4d/file
分块 md5sum 的原因是为了避免“一个目录中有一大堆文件/目录”的问题。由于 md5sum 分块,这意味着 1 个文件会导致创建 8 个目录。这对 inode 的影响非常明显,但我不清楚一旦我们达到规模,这些影响会对 XFS 产生什么影响。
有什么影响?
顺便说一下,这是内核 2.6.32,目前是 CentOS 6.2(如果需要可以更改)。
在测试中,我使用默认值创建了 xfs 卷,并且没有使用任何挂载选项。这是为了尽早排除问题。noatime
很简单,因为我们不需要它。总体 XFS 调整是我需要解决的另一个问题,但现在我担心我们现在设计的元数据乘数效应。
我已经知道更好的解决方案是什么,我只是不知道我是否有理由推动改变。
由于 md5sums 在第一位数字上非常独特,而且单个子项目很少超过 500 万个文件,所以在我看来我们只需要前两个块。这会产生如下布局:
0123456/001/0e15/a644/897219acb4b597f651d69a4d/file
一个完全完整的一级和二级目录将在每个一级目录中有 2 16个一级目录和 2 16个二级目录,卷上总共有 2 32 个目录。
因此,假设的 500 万个文件子项目将有 2× 16个一级目录,每个二级目录大约有 76 (+/- 2) 个二级目录,每个二级目录中有一个或两个三级目录。
这种布局的元数据效率更高。我只是不知道是否值得努力改变现在的情况。
除了 XFS应该扩展到这一点之外,没有其他主要建议。我在 2003 年开始使用文件系统,因为我需要解决一个应用程序的问题,该应用程序可以轻松地将 800,000 个文件放在一个目录中。ext2 和 ext3 在这些文件系统中的操作通常会失败。
这在很大程度上取决于您的应用程序及其访问文件的方式(目录遍历等)。
如果这一切都在一台服务器上,我会根据您对大量元数据操作的期望来查看外部 SSD 日志。但你知道那部分。我仍然会推动使用第二个 md5 示例进行重组。我的意思是,现在是重构的好时机,对吧?