我刚刚注意到,如果我执行time fstrim /<some ext4>; time fstrim /<some ext4>
第二次调用,通常0 bytes trimmed
会立即打印并完成。但是,如果我在 XFS 上执行同样的事情,两次调用所花的时间完全相同,并且打印的修剪字节数完全相同。这让我怀疑修剪真的有效吗?如果有效,是否有任何标志可以打开以使 XFS 不重新修剪已经修剪过的块?
我使用所有默认设置来挂载 xfs。
答案1
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