XFS 上的 ikeep 挂载选项到底起什么作用?

XFS 上的 ikeep 挂载选项到底起什么作用?

我有一台装有 512GB SSD 的笔记本电脑。我使用 XFS 作为/文件系统,并挂载了noatime,discard,ikeep。这ikeep是因为一些邮件列表发布了有关discardXFS 上 TRIM 的速度有多慢并建议使用ikeep以提高性能。然而,在 Linux 内核文档中它说:

当指定 ikeep 时,XFS 不会删除空的 inode 簇,而是将它们保留在磁盘上。ikeep 是传统的 XFS 行为。当指定 noikeep 时,空的 inode 簇将返回到可用空间池。对于非 DMAPI 挂载,默认值为 noikeep,而当使用 DMAPI 时,ikeep 是默认值。

这是否意味着没有空间曾经如果我使用 ikeep,有多少文件会被释放,这样丢弃就毫无意义了,因为无论我删除多少文件,可用空间都不会增加?对于“传统 XFS 行为”来说,这似乎是一个荒谬的想法。

ikeep 到底是做什么的?

答案1

ikeep完全按照文档所述执行。我相信你的困惑来自于不理解什么是inode是。文件inode存储有关文件的元数据。它是文件系统结构的一部分,包含没有任何文件中的数据。正如引入此需求的补丁的描述ikeep所解释的那样:

XFS 在创建 inode 时会动态分配空间,这与许多其他文件系统不同,在 mkfs 时 inode 空间是静态分配的。虽然 inode 空间是动态分配的,但它从未被释放 - 到目前为止是这样。

这种不释放空间的做法往往会导致文件系统碎片化,因为文件系统中有大量文件进进出出。这还会导致 inode 及其父目录更加分散在磁盘上。

大多数文件系统会在您“创建文件系统”(即“格式化驱动器”)时分配它们所需的所有 inode,并且绝不会删除它们。XFS 的不同之处在于它会按需分配它们。

碎片化和“磁盘上分散”的东西会给传统的旋转磁盘带来严重的性能问题。然而,在 SSD 上,这些根本不是问题。相反,删除磁盘块是 SSD 上的一个严重性能问题,而对旋转磁盘来说却不是问题。因此,虽然将删除空 inode 作为默认操作的补丁程序对旋转磁盘来说是一种性能改进,但它实际上使 SSD 上的性能变差。因此建议ikeep在 SSD 上使用。

相关内容