具有 inode 关闭在磁盘上的 Linux 文件系统

pts*_*pts 5 linux filesystems inode

我想ls -laR /media/myfs尽可能快地在 Linux 上运行。我将在文件系统上有 100 万个文件,总文件大小为 2TB,一些目录包含多达 10000 个文件。我应该使用哪个文件系统以及我应该如何配置它?

据我了解,之所以ls -laR慢是因为stat(2)每个inode(即100万stat(2)秒),而且由于inode随机分布在磁盘上,每个都stat(2)需要一次磁盘寻道。

以下是我想到的一些解决方案,但我都不满意:

  • 在 SSD 上创建文件系统,因为 SSD 上的查找操作很快。这是行不通的,因为 2TB SSD 不存在,或者它太贵了。

  • 创建一个跨越两个块设备的文件系统:一个 SSD 和一个磁盘;磁盘包含文件数据,SSD 包含所有元数据(包括目录条目、inode 和 POSIX 扩展属性)。是否有支持此功能的文件系统?它会在系统崩溃(停电)中幸免于难吗?

  • 使用find /media/myfs在ext2,ext3和ext4的,而不是ls -laR /media/myfs,因为前者可以在优势d_type领域(见getdents(2)手册页),因此它不具有统计。不幸的是,这不符合我的要求,因为我还需要所有文件大小,find /media/myfs但不能打印。

  • 使用文件系统,例如 VFAT,它将 inode 存储在目录条目中。我很喜欢这个,但是 VFAT 对我来说不够可靠和灵活,而且我不知道有任何其他文件系统可以做到这一点。你?当然,在目录条目中存储 inode 不适用于链接数超过 1 的文件,但这不是问题,因为我的用例中只有几十个这样的文件。

  • /procor 中调整一些设置,sysctl以便 inode 永远锁定到系统内存。这不会加快第一个ls -laR /media/myfs,但它会使所有后续调用非常快。我怎样才能做到这一点?我不喜欢这个想法,因为它不会加速第一次调用,目前需要 30 分钟。此外,我还想在内存中锁定 POSIX 扩展属性。我该怎么做?

  • 使用具有在线碎片整理工具的文件系统,可以指示将 inode 重新定位到块设备的开头。重定位完成后,我可以运行dd if=/dev/sdb of=/dev/null bs=1M count=256将块设备的开头提取到内核内存缓存中,而无需查找,然后stat(2)操作会很快,因为它们从缓存中读取。一旦它们被读取,有没有办法将这些 inode 和/或块锁定到内存中?哪个文件系统有这样的碎片整理工具?

del*_*ray 1

我只会使用 ext4 并确保您设置了 dir_index 。您可以通过运行以下命令来检查该标志:

dumpe2fs /dev/drivepartition | grep "Filesystem features:"
Run Code Online (Sandbox Code Playgroud)

您遇到的最大问题只是文件系统上的文件总数。您在文件系统上运行的任何操作都必须查看每个文件。任何文件系统都是如此。一个目录中的 10,000 个文件可能看起来很多,但我发现文件系统不会变慢,直到达到 40,000 个或更多文件,这实际上是 ext2 等文件系统的较旧症状。

听起来您正在尝试做一些特定的事情,而不仅仅是拥有一个通用的文件系统。如果您可以解释您想要做什么,我们可能会建议一种优化数据的方法。例如,数据库。