ntfs-3g `big_writes` 挂载选项的缺点

ntfs-3g `big_writes` 挂载选项的缺点

man ntfs-3g使big_writes挂载选项看起来像是一件好事:

   big_writes
          This option prevents fuse from splitting write buffers into 4K
          chunks, enabling big write buffers to be transferred from the
          application in a single step (up to some system limit, generally
          128K bytes).

没有列出任何缺点...我什么时候想避免安装 big_writes

答案1

这是一个好问题,真的。从我在这里看到的情况来看,它可能没有任何缺点。

时间回到2008年,big_writes当时首先添加到FUSE米克洛斯说道:

在 2.6.26 之前,fuse 仅支持单页写入请求。理论上,所有熔断文件系统都应该能够支持大于 4k 的写入,因为 API 中没有任何内容可以阻止它。 不幸的是,NTFS-3G 中有一个已知的情况,即大写操作会导致文件系统损坏。 还可能存在其他文件系统,其中缺乏对大写入请求的测试会导致错误。

为了防止内核升级时出现此类问题,请默认禁用大写操作,但让文件系统设置一个标志来打开它。

具体问题在 NTFS-3G 中记录param.h为:

/*
 *        Use of big write buffers
 *
 *    With small volumes, the cluster allocator may fail to allocate
 *    enough clusters when the volume is nearly full. At most a run
 *    can be allocated per bitmap chunk. So, there is a danger when the
 *    number of chunks (capacity/(32768*clsiz)) is less than the number
 *    of clusters in the biggest write buffer (131072/clsiz). Hence
 *    a safe minimal capacity is 4GB
 */

#define SAFE_CAPACITY_FOR_BIG_WRITES 0x100000000LL

目前,它确实通过在请求 big_writes 之前验证 fs 容量至少为 4GB 来防御此限制。所以它是安全的。

事实上,图克塞拉建议打开它如果 NTFS-3G 正在耗尽您的 CPU:

解决方法:使用挂载选项“big_writes”通常会降低 CPU 使用率,前提是请求写入的软件支持大块。

未来

自从libfuse 3.0.0(2016)big_writes始终开启:

安装-o big_writes选项已被删除。现在它始终处于活动状态。想要限制写入请求大小的文件系统应该使用该-o max_write=<N>选项。犯罪

然而,libfuse3 是全新一代,ntfs-3g 根本不支持针对它进行构建。我无意中将新的 1MiB 写入缓冲区(libfuse 3.6.0)向后移植到 ntfs-3g 的内部迷你 libfuse2 中,因此如果您想使用它,可以从这里获取它:

  1. https://github.com/AOSC-Dev/ntfs-3g/commit/96f6fbedaf7aad70b4a4c39d8dd4a637a63beec1
  2. https://github.com/AOSC-Dev/ntfs-3g/commit/6aa576ae2a13fb636bff65bcb2701e731d2f5a94

是的,我确实记得重构写入大小/卷大小限制。是的,即使在现代 Ryzen 上,大文件写入速度也更快。

PS:我计划向 ntfs-3g 添加 libfuse3 支持,但没有真正的截止日期。 Tuxera 显然对这样的改变不感兴趣,而且为一个分叉起一个名字对我来说有点太多了。

相关内容