fstrim 在 xfs 上非常慢并且总是返回相同的值,这与 ext4 不同

Wan*_*ang 3 xfs ssd trim

我刚刚注意到,如果我进行time fstrim /<some ext4>; time fstrim /<some ext4>第二次通话,通常会0 bytes trimmed立即打印并完成。但是,如果我在 XFS 上做同样的事情,其中​​ 2 个调用将花费完全相同的时间并打印完全相同数量的修剪字节。这让我想知道修剪真的有效吗?如果是,是否可以打开任何标志以使 XFS 不重新修剪已修剪的块?

我使用所有默认设置来挂载 xfs。

Don*_*mik 5

Ext4 缓存已在内存中修剪的范围,并且在重新启动之前不会重新修剪它们。

XFS 不会缓存此信息,并会在每次 fstrim 启动时重新修剪所有内容。

来源:

Fstrim 在文件系统上调用 FITRIM IOCTL,最终调用 FS 特定的内部函数:https://github.com/util-linux/util-linux/blob/master/sys-utils/fstrim.c#L120

我省略了几个中间函数......

Ext4 驱动程序检查内存结构,如果该范围已被丢弃。如果没有,它会尝试丢弃它并将其设置为已丢弃,以防止进一步丢弃,直到系统重新启动: https ://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree /fs/ext4/mballoc.c?h=v6.0#n6442

XFS 内部函数没有这样的检查,只是丢弃所有内容: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/xfs/xfs_discard.c ?h= v6.0#n151

  • @Wang AFAIK,这在任何地方都没有正式记录,因此唯一可靠的来源可能是源代码本身。 (2认同)