肯特·奥弗斯特里特周六晚上发布了一组21个补丁,以彻底修改Bcachefs文件系统的磁盘记账代码。这一更改确实破坏了与现有磁盘记账磁盘格式的兼容性,因此在迁移到新版本时需要升级,新版本可能会在Linux v6.9上登陆。
OverStreet致力于Bcachefs磁盘记账重写已经有一段时间了,本周末发布了最初的补丁系列。他解释了这次重写的情况:
旧的磁盘记账方案速度很快,但有一些限制:
-缺乏可伸缩性:它基于由未完成日志缓冲区额外分片的PercPU计数器,然后在日志写入之前,我们会将计数器汇总并将其添加到日志条目中。但这意味着所有计数器都会添加到每次日志写入中,这意味着它永远不能支持每个快照的计数器。
- 这是一个痛苦的扩展,这就是为什么,直到现在,我们没有适当的压缩会计,并获得压缩比需要一个完整的btree扫描
在新方案中:
- 每一组计数器都是bkey,即btree(BTREE_ID_accounting)中的键。这意味着它们不会被钉在日志中
-Key有结构,可扩展DISK_ACCOUNTING_KEY是一个带标签的联合,它只是在BPO上联合
-计数器是增量,直到刷新到底层的btree,这意味着计数器更新是正常的btree更新;btree写缓冲区使计数器更新更高效。
由于从btree读取计数器的开销很大--它需要一个写缓冲区刷新来获得最新的计数器--我们还在内存中维护了一组并行的记账,有点像旧的方案,但没有每个日志缓冲区的分片。内存中的会计在eytzinger树中由disk_accounting_key/bpos索引,计数器本身是u64。
这打破了文件系统的磁盘格式,因此在升级(或降级)此新版本时需要重新生成记帐。这应该通过内核fsck透明地实现,但目前Linux 6.7用户有一些已知的限制。我们希望有可能在Linuxv6.9中为Bcachefs准备好这个磁盘记账重写。
有关此新代码的更多详细信息,请访问补丁系列.