我只是注意到如果我time fstrim /<some ext4>; time fstrim /<some ext4>
打第二个电话通常会打印0 bytes trimmed
并立即完成。但是,如果我在 XFS 上做同样的事情,其中 2 个调用将花费完全相同的时间并打印完全相同数量的修剪字节。这让我想知道修剪真的有效吗?如果是,是否可以打开任何标志以使 XFS 不重新修剪已经修剪的块?
我使用所有默认设置来挂载 xfs。
我只是注意到如果我time fstrim /<some ext4>; time fstrim /<some ext4>
打第二个电话通常会打印0 bytes trimmed
并立即完成。但是,如果我在 XFS 上做同样的事情,其中 2 个调用将花费完全相同的时间并打印完全相同数量的修剪字节。这让我想知道修剪真的有效吗?如果是,是否可以打开任何标志以使 XFS 不重新修剪已经修剪的块?
我使用所有默认设置来挂载 xfs。
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