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

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

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

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

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

  • 在 SSD 上创建文件系统,因为 SSD 上的寻道操作很快。这行不通,因为 2TB SSD 不存在,或者价格过高。

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

  • 在 ext2、ext3 或 ext4 上使用find /media/myfs,而不是ls -laR /media/myfs,因为前者可以利用d_type字段的优势(请参阅getdents(2)手册页),因此它不必统计。不幸的是,这不符合我的要求,因为我还需要所有文件大小,而这find /media/myfs不会打印。

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

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

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

答案1

我将用我对你的问题的回答来交换你对我问题的回答:要在 /proc 或 /sys 中调整哪些旋钮才能将所有的 inode 保存在内存中?

现在我来回答你的问题:

我正在努力解决类似的问题,当服务器负载很重时,我试图让 ls -l 通过 NFS 快速处理包含几千个文件的目录。

NetApp 出色地完成了这项任务;到目前为止,我尝试过的所有其他产品都做不到。

研究这个问题时,我发现了一些将元数据与数据分离的文件系统,但它们都有一些缺点:

  • dualfs:有一些针对 2.4.19 的补丁,但没有太多其他补丁。
  • lustre:ls -l 是最坏的情况,因为所有元数据除了文件大小存储在元数据服务器上。
  • QFS for Solaris、StorNext/Xsan:如果不进行大量投资,则无法获得出色的元数据性能。

所以这没有帮助(除非你可以恢复 dualfs)。

就您而言,最好的答案是尽可能增加主轴数。最丑陋但最便宜和最实用的方法是购买几年前在 Ebay 上的企业级 JBOD(或两个)和光纤通道卡。如果您仔细寻找,您应该能够将成本控制在 500 美元左右。搜索条件“146gb”和“73gb”将大有帮助。您应该能够说服卖家就此类商品达成交易,因为他们有很多这样的商品,但几乎没有感兴趣的买家:

http://cgi.ebay.ca/StorageTek-Fibre-Channel-2TB-14-Bay-HDD-Array-JBOD-NAS-/120654381562?pt=UK_Computing_Networking_SM&hash=item1c178fc1fa#ht_2805wt_1056

在所有驱动器上设置 RAID-0 条带。认真备份数据,因为其中一两个驱动器不可避免地会出现故障。使用 tar 进行备份,而不是 cp 或 rsync,这样接收单个驱动器就不必处理数百万个 inode。

这是我发现的(无论如何,在这一特定的历史时刻)增加 2-4 TB 范围内文件系统的 IOP 最便宜的方法。

希望这会有所帮助——或者至少很有趣!

答案2

磁盘包含文件数据,而 SSD 包含所有元数据...是否有支持此功能的文件系统?

btrfs 在某种程度上支持这一点,btrfs 维基。可以为元数据指定 raid1(为数据指定 raid0 - 大多数数据最终都会存储在大型 HDD 上),这样 SSD 就会始终拥有元数据的副本以供读取(我不知道 btrfs 在选择读取元数据的源时会有多聪明)。我还没有看到过这种设置的任何基准测试。

答案3

不幸的是没有答案,尽管我确实在谷歌上搜索了半个小时的答案。

创建一个跨两个块设备的文件系统:一个 SSD 和一个磁盘;磁盘包含文件数据,SSD 包含所有元数据(包括目录条目、inode 和 POSIX 扩展属性)。是否有支持此功能的文件系统?它能否在系统崩溃(断电)后继续存在?

这正是我想要的。

有关链接,请参阅此 pastebin,因为我不允许发布多个链接......

http://www.notehub.org/2014/10/2/external-metadata-more-information

这里讨论了 btrfs 的多设备支持:

Btrfs:与多种设备协同工作,作者:Jonathan Corbet,2013 年 12 月 30 日(LWN),[链接][1]

但是,尽管您可以将元数据 (-m raid1) 镜像到 SSD,但您仍然不得不使用 SSD 来存储数据 (-d raid0),至少是部分存储。

好消息是目前正在开展一些工作:

专用元数据驱动器 扬·施密特和阿恩·詹森 (尚未进入内核)我们能够非常轻松地拆分数据和元数据 IO。元数据往往由寻道控制,对于许多应用程序来说,将元数据放在更快的 SSD 上是有意义的。[链接][2]

如果您愿意使用 IBM 专有的通用并行文件系统 (GPFS),那么这似乎已经是可能的。阅读“如何将所有 GPFS 文件系统元数据迁移到 SSD”:[链接][3]

答案4

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

dumpe2fs /dev/drivepartition | grep "Filesystem features:"

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

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

相关内容