索尼工程师再次帮助微软大幅度提升exFAT文件系统在Linux上的性能
微软在 2006 年推出 exFAT (扩展文件分配表) 文件系统用于优化闪存存储性能,到 2012 年微软推出 64 位版 exFAT 文件系统作为 FAT32 的后继者,7 年后的 2019 年微软宣布在 Linux 系统中支持 exFAT 格式。
到 2022 年索尼工程师 Yuezhang Mo 注意到减少目录条目的重复遍历可以让 exFAT 文件系统的性能提升高达 57%,改进后的版本在 Linux Kernel 6.2 版 (发布于 2023 年 2 月) 中得到实现。
现在这名工程师再次帮助微软提升 exFAT 文件系统的性能,最新的拉取请求包含大量与 exFAT 相关的改进,其中就包括关于继续提升 exFAT 在 Linux 中的性能的改进。
在拉取请求中索尼工程师提到:
- 修复 exfat_get_block () 中的随机堆栈损坏和不正确的错误返回
- 通过改进检查极端情况来优化 exfat_get_block ()
- 修复 exfat_find_last_cluster 中自链接 (self-linked) 造成的无限循环
- 删除无效的 EXFAT_CLUSTERS_UNTRACKED 代码
- 添加缺失的关机检查
- 使用丢弃挂载选项提高删除性能
丢弃挂载指的是通知底层存储设备不再使用的块的操作,因此当使用丢弃选项挂载文件系统时,该功能会启用实时丢弃操作,每次当块从已使用转换为空闲状态时,这些操作都会自动通知存储设备。
索尼工程师在补丁说明中写道:
如果启用丢弃挂载选项则在释放簇时就会丢弃文件的簇,逐个丢弃簇会显著降低性能,当释放大量簇时性能不佳还会造成软锁定,此提交通过批量丢连续簇来提高性能。
作为测试使用 80GB 的文件用来对比,删除该文件原本在 exFAT 中需要 4 分 46 秒,通过此次优化后只需要 2 秒就可以完成,相当于这个补丁给文件文件删除的性能提高了 172 倍,当然具体文件体积和数量可能会有些性能方面的差异。
下面是衡量指标:
# truncate -s 80G /mnt/file
# time rm /mnt/file
如果没有这个补丁:
实际花费时间为 4 分 46.183 秒
用户操作时间为 0 秒
系统操作时间为 12.863 秒
有了这个补丁后:
实际花费时间为 1.661 秒
用户操作时间为 0 秒
系统操作时间为 0.017 秒
最后虽然补丁是提交了但合并到 Linux Kernel 可能还需要很长时间,一方面这需要微软检查并测试,另一方面也需要内核团队后续的确认,所以短时间应该不会合并到 Linux Kernel 即将发布的新版本中。