现在 OpenZFS 的重复数据删除功能很好,并且你不应该使用它

  • 发布信息:OpenZFS 2.3.0 即将发布,包含新的“快速去重”功能,作者团队在 2023 和 2024 年为此努力,认为其相比旧去重有很大进步,是进一步改进的坚实基础。
  • 去重相关内容

    • 什么是去重:OpenZFS 准备将数据写入磁盘时,若数据已在磁盘,不进行写入,而是添加对现有副本的引用,挑战在于确定数据是否在磁盘及位置,存储信息的是“去重表”,概念上是哈希表,数据校验和为“键”,磁盘位置和引用计数为“值”,存储在池的元数据中。
    • 去重如何工作:去重启用时,“写”IO 路径改变,数据块准备后计算校验和,若去重表中未找到,调用元 slab 分配器请求空间,找到则增加引用计数,分配的块有特殊标志辅助释放,所有写和释放操作都需查询和写入去重表,开销大。
    • 传统去重为何糟糕:传统去重在去重表的存储和与 IO 管道的交互方面存在问题,包括去重表的构造和存储、累积和暂存去重表更改的开销、表中的“唯一”条目问题。去重表使用标准 OpenZFS 磁盘哈希表对象,每个条目占用 7 个块,更新时需加载整个块,传统推荐认为去重需要大量内存,dedup vdev 类可帮助减少内存需求,但构建具有挑战性。
    • 快速去重如何解决这些问题

      • 减小活动条目列表大小:通过优化 live entry type ddt_entry_t的布局,将其内存占用从 424 字节减少到 216 字节,同时压缩后存储部分也更小。
      • 去重日志:在事务结束时,将更新的条目记录在去重日志中,而不是直接写入去重表,提高查找效率,减少不必要的 IO,但增加了查找的复杂性。
      • 增量日志刷新:为控制日志内存占用,改变日志刷新方式,使部分日志每次事务都写入去重表,同时处理日志的清空和交换,以提高效率。
      • 唯一条目:新的zpool ddtprune命令可删除去重表中的一些唯一条目,dedup_table_quota属性可设置去重表的最大可能大小,帮助管理员管理表大小。
  • 其他信息:有一些操作改进,如zpool prefetch -t ddt预加载去重表,新的 kstats 和 tuneables 用于监控和调整去重系统,现有 dedup 感知工具已更新。对于现有去重表,部分功能可直接使用,部分需要格式更改或额外工作,若对大型去重表感兴趣可与 Klara 联系。
  • 去重的现状和建议:认为去重现在足够好可尝试,但还不是非常好,开销仍需考虑,对于大多数通用工作负载,找到可去重的块很罕见,如今 OpenZFS 2.2 有 BRT(块克隆),大多数情况下使用 BRT 可获得类似的增益而无需承受去重的痛苦。
  • 总结:去重需平衡 IO 吞吐量、内存使用和去重表大小,传统去重有“甜蜜点”,快速去重改善了这些因素,但仍需大量数据且无法利用其他“零复制”选项才有好处。
阅读 287
0 条评论