- 发布信息:OpenZFS 2.3.0 即将发布,包含新的“快速去重”功能,作者团队在 2023 和 2024 年为此努力,认为其相比旧去重有很大进步,是进一步改进的坚实基础。
去重相关内容:
- 什么是去重:OpenZFS 准备将数据写入磁盘时,若数据已在磁盘,不进行写入,而是添加对现有副本的引用,挑战在于确定数据是否在磁盘及位置,存储信息的是“去重表”,概念上是哈希表,数据校验和为“键”,磁盘位置和引用计数为“值”,存储在池的元数据中。
- 去重如何工作:去重启用时,“写”IO 路径改变,数据块准备后计算校验和,若去重表中未找到,调用元 slab 分配器请求空间,找到则增加引用计数,分配的块有特殊标志辅助释放,所有写和释放操作都需查询和写入去重表,开销大。
- 传统去重为何糟糕:传统去重在去重表的存储和与 IO 管道的交互方面存在问题,包括去重表的构造和存储、累积和暂存去重表更改的开销、表中的“唯一”条目问题。去重表使用标准 OpenZFS 磁盘哈希表对象,每个条目占用 7 个块,更新时需加载整个块,传统推荐认为去重需要大量内存,
dedupvdev 类可帮助减少内存需求,但构建具有挑战性。 快速去重如何解决这些问题:
- 减小活动条目列表大小:通过优化 live entry type
ddt_entry_t的布局,将其内存占用从 424 字节减少到 216 字节,同时压缩后存储部分也更小。 - 去重日志:在事务结束时,将更新的条目记录在去重日志中,而不是直接写入去重表,提高查找效率,减少不必要的 IO,但增加了查找的复杂性。
- 增量日志刷新:为控制日志内存占用,改变日志刷新方式,使部分日志每次事务都写入去重表,同时处理日志的清空和交换,以提高效率。
- 唯一条目:新的
zpool ddtprune命令可删除去重表中的一些唯一条目,dedup_table_quota属性可设置去重表的最大可能大小,帮助管理员管理表大小。
- 减小活动条目列表大小:通过优化 live entry type
- 其他信息:有一些操作改进,如
zpool prefetch -t ddt预加载去重表,新的 kstats 和 tuneables 用于监控和调整去重系统,现有 dedup 感知工具已更新。对于现有去重表,部分功能可直接使用,部分需要格式更改或额外工作,若对大型去重表感兴趣可与 Klara 联系。 - 去重的现状和建议:认为去重现在足够好可尝试,但还不是非常好,开销仍需考虑,对于大多数通用工作负载,找到可去重的块很罕见,如今 OpenZFS 2.2 有 BRT(块克隆),大多数情况下使用 BRT 可获得类似的增益而无需承受去重的痛苦。
- 总结:去重需平衡 IO 吞吐量、内存使用和去重表大小,传统去重有“甜蜜点”,快速去重改善了这些因素,但仍需大量数据且无法利用其他“零复制”选项才有好处。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。