Paper: Don’t Maintain Twice, It’s Alright: Merged Metadata Management in Deduplication File System with GOGETAFS

Slide: View the slides

论文提出了一种新的去重文件系统 GoGetaFS,它通过合并去重元数据和文件系统元数据,减少了维护去重元数据所需的额外I/O操作和排序开销。作者通过一系列技术来管理数据和元数据,使得 GoGetaFS 在保持兼容性的同时,实现了高效和1️⃣节省内存的去重功能。实验表明,GoGetaFS 在各种工作负载下都优于现有的去重文件系统,并且能够2️⃣显著减少元数据维护开销

Background

image-20250319104322988

重删有两类系统:

  • 独立去重系统(Stand alone Deduplication System):通常作为文件系统之上的独立层运行,管理指纹索引来检测冗余数据
  • 去重文件系统(Deduplication File System, DedupFS):将数据去重直接集成到文件系统的方案,旨在消除独立去重系统的冗余元数据维护问题。

独立去重系统

独立去重系统 是目前最常见的去重存储解决方案。

它有两个关键数据映射表

  • L2P(Logical-to-Physical)
  • FP2P(Fingerprint-to-Physical)

流程

  1. 数据写入:计算数据块的加密指纹。在 FP2P 表中查找该指纹:
    • 若 已存在,则 更新引用计数,避免写入新数据。
    • 若 不存在,则 插入新的 FP2P 记录 并写入数据块。
  2. 数据读取:通过 L2P 表找到 PBN,并返回对应数据。
  3. 数据删除
    • 先删除 L2P 记录,然后减少 FP2P 表中的引用计数。
    • 如果引用计数变为 0,则释放物理块。

元数据管理

  • 由于去重会将多个逻辑块映射到同一个物理块,系统必须保证 FP2P 映射的崩溃一致性(Crash Consistency)
  • 现有方法:
    • 日志记录(Write-ahead Logging):先将 FP2P 变更记录写入日志区(但不立刻生效),当 L2P 也持久化后,才将 FP2P 变更正式写入元数据。
    • 写时复制(Copy-on-Write)
    • 软更新(Soft Updates):在元数据写入前,记录 FP2P 依赖关系,并确保 FP2P 先更新,L2P 后更新。

独立去重系统的问题

  1. 额外的元数据维护
    • 独立去重系统需要 单独维护 L2P 和 FP2P,增加了 额外的 I/O 负担。
    • 写入路径涉及两次 I/O(一次 L2P,一次 FP2P),影响性能。
  2. 数据一致性问题
    • FP2P 映射需要独立存储,如果 崩溃发生在 FP2P 和 L2P 更新之间,会导致数据不一致。
    • 需要额外的恢复机制 来修复 FP2P 记录和 L2P 记录的不一致情况。
  3. 高计算开销:传统去重使用加密指纹(如 SHA-1)计算成本高,影响写入性能。

去重文件系统

代表性方案:

  • DeNOVA(离线去重)
  • NV-Dedup(混合去重)
  • Light-Dedup(基于 PM 的去重)

传统 DedupFS 特点:

  • 采用单一数据路径,直接在文件系统中执行去重操作:L2P、FP2P
  • 不需要独立的 FP2P 维护,但仍然存在额外的 FP2P 记录更新

Observation and Motivation

其中几个观察对于我的论文十分有帮助!记得引用。

Observation 1:当前 DedupFS 性能低于预期

论文使用 FIO 工具对三种不同的 DedupFS 进行测试:

  • DeNOVA
  • NV-Dedup
  • Light-Dedup
  • Ideal-Dedup(一个理想模型,用作基准)

研究模拟了不同去重比率(0%、25%、50%、75%)下的 4KiB 顺序写入负载。

image-20250319104852969

0% 去重比率下,所有 DedupFS 的性能都低于 Ideal-Dedup。

  • 原因:DedupFS 在每次写入时都需要计算指纹(FP)并查询 FP2P 表,而 Ideal-Dedup 仅执行基本的文件系统操作。

随着去重比率的增加,理论上 DedupFS 性能应该逐步接近 Ideal-Dedup,但 实验结果显示,性能差距并未明显缩小

  • 疑问:既然 FP 计算和去重减少了数据写入,为什么吞吐量没有提升?

Observation 2:重复数据删除元数据维护是主要瓶颈

论文分析了 DedupFS 开销的五个主要组成部分(Breakdown):

  1. Dup Identify(去重识别):计算指纹、查找 FP2P 表、内容比对
  2. Dedup Metadata(去重元数据维护):记录/更新 FP2P 映射
  3. Data Write(数据写入):将数据块写入存储
  4. FS Metadata(文件系统元数据维护):更新 L2P(逻辑到物理)映射
  5. Others(其他开销):VFS、垃圾回收、块分配等

image-20250319110114224

去重元数据维护开销占 I/O 时间的 18% - 38%,成为影响 DedupFS 性能的主要瓶颈。

  • 原因:
    1. 额外的崩溃一致性(crash consistency)开销:传统 DedupFS 需要在 写入 L2P 之前 确保 FP2P 表的持久化,以保证一致性。
    2. I/O 放大和并行性受限:由于 FP2P 需要独立写入,导致两次元数据写入,并减少了 I/O 并行性。

所以论文自然而然提出了「合并元数据」这一重要设计(优势如下):

  • 重复使用成熟的文件系统 I/O 路径和崩溃一致性机制。DedupFS 利用文件系统通过使用与文件系统 L2P 条目相同的 I/O 路径来保证 LFP 条目的持久性和崩溃一致性,从而减少实施工作量并提高稳健性。
  • 减少元数据 I/O 放大和排序点。LFP (Logical-Fingerprint-Physical) 条目避免在存储中维护 FP2P 表,从而减少 I/O 放大和排序点。
  • 消除重复数据删除和文件系统之间的不一致。由于 FP2P 映射始终在容错 LFP 条目中可用,因此无需修复不一致,这可以进一步加快故障恢复。

Design

在解决去重文件系统(DedupFS)中的元数据维护开销问题后,GOGETAFS 采用了一种创新的 逻辑-指纹-物理(LFP)映射,将去重元数据合并到文件系统元数据中,从而消除了额外的 FP2P 维护操作,提高了系统的性能和一致性。GOGETAFS 的设计主要围绕四个目标展开:通用性(Generic)、高效性(Effective)、内存高效性(Memory-efficient)以及可配置性(Configurable)。为了满足这些目标,GOGETAFS 采用了一系列关键技术,包括:

  • LFP 映射
  • 全局 LFP 表(GLT)
  • 溢出 FP 表(OFT)
  • 不同的元数据管理策略

image-20250319112934926

GOGETAFS 在数据管理方面解决了传统 DedupFS 与文件系统在数据组织上的不兼容问题。DedupFS 传统上以块为单位进行去重,而文件系统通常以 extent(连续块)方式管理数据。为此,GOGETAFS 采用了两种策略:

  • 一种是利用超指纹(Super-Fingerprint, SFP)对整个 extent 进行指纹计算,但这种方式降低了去重比率,并增加了串行化计算带来的并行性问题。因此,GOGETAFS 选择了更优的方案,即使用溢出 FP 表OFT),将连续块的指纹存储到一个额外的存储区域,从而避免 LFP 记录的可变长度问题,同时保持了指纹计算的并行性。OFT 的设计基于存储分配的空间局部性,使其能够高效地管理指纹数据,并且在文件删除时不需要额外的清理操作,因为未被 LFP 记录引用的 OFT 条目可以被安全覆盖。

image-20250319113729171

元数据管理方面,GOGETAFS 采用了全局 LFP 表(GLT),以加速指纹查询和数据去重过程。GLT 通过动态哈希表(Dynamic Hash Table, DHT)组织 LFP 记录,以指纹作为键,实现快速的指纹查找和数据重定向。相比于传统 DedupFS 需要在存储中维护 FP2P 表,GLT 作为一个内存结构,可以通过并行化哈希查询显著提升指纹匹配的速度。此外,GLT 还采用了乐观并发控制(Optimistic Concurrency Control)机制来处理多线程环境下的去重操作,确保多个线程在插入相同指纹时不会导致数据不一致。

为了适应不同的系统环境,GOGETAFS 设计了多种 GLT 变体,以优化内存使用。在内存受限的环境(如 PC)中,GOGETAFS 采用了混合存储策略(Hybrid),将指纹索引存储在内存,而将值(物理块地址和引用计数)存储在存储设备中。这种方式减少了对内存的占用,同时仍然可以通过快速的内存查询提高去重效率。在极端内存受限的环境(如移动设备)中,GOGETAFS 采用了静态哈希表(Static Hash Table, SHT)结构,将 GLT 直接存储在设备上,以避免内存消耗过大,同时优化存储访问路径,以减少 I/O 放大效应。

崩溃一致性和恢复方面,GOGETAFS 充分利用了文件系统的事务和日志机制,使 LFP 记录的持久化与文件系统元数据的持久化同步进行。这意味着,即使发生崩溃,GLT 也可以通过遍历 LFP 记录来恢复,而不需要额外的 FP2P 重建步骤。这种方法不仅提高了恢复速度,还减少了额外的存储写入开销。此外,GOGETAFS 采用了存储友好的恢复策略,在正常关闭系统时,会将 GLT 缓存到一个特殊的文件,以便在下次启动时快速恢复,而在崩溃恢复时,则采用并行扫描 LFP 记录的方式,以提高恢复效率。

GOGETAFS 的实现基于 NOVA 文件系统(in PM)和 F2FS(in SSD),并通过修改其写入条目(write entry)结构来存储 LFP 记录。通过替换原有的 4 字节校验和字段和 4 字节填充字段,GOGETAFS 无需额外的存储空间即可存储 8 字节的非加密指纹。OFT 被设计为一个无锁(lock-free)的数据结构,利用文件系统的事务机制来确保数据一致性,同时避免了传统 DedupFS 需要的额外排序点。在移植性方面,GOGETAFS 也可以扩展到其他文件系统,如 F2FS 以及 BtrFS,只需要对它们的 L2P 记录进行相应的扩展,以存储指纹信息。

Evaluation

image-20250319113826289

GOGETAFS 的评估基于多个真实世界的工作负载和合成基准测试,涵盖了不同的存储场景,如服务器、PC 和移动设备。实验环境包括 Intel Xeon 服务器,配置有 512GB Optane DCPMM 和 128GB DRAM,并运行 CentOS Stream 5.1 内核。此外,还在 Z-SSD 模拟环境下对 GOGETAFS 进行了额外测试,以验证其在超低延迟 SSD(ULL SSD)上的表现。

image-20250319114333262

在基本 I/O 性能测试中,GOGETAFS 在所有去重比率(0%-100%)的情况下都优于现有 DedupFS,如 NV-Dedup 和 Light-Dedup。特别是在 2MB 块大小的 I/O 负载下,GOGETAFS 不仅超越了 Light-Dedup,还比 NOVA 文件系统本身更快。这一现象的原因是 GOGETAFS 采用了更优化的 FP 计算和 I/O 并行策略,使得指纹计算能够与数据写入并行进行,从而减少了存储内部缓冲区的争用。此外,在 WebVMs 和 Mails 这样的真实世界工作负载中,GOGETAFS 在 2MB 块大小时的吞吐量比 Light-Dedup 高出 23% - 32%,表明在混合负载情况下,GOGETAFS 仍然具有明显的性能优势。

image-20250319114429817

在元数据维护开销分析中,实验结果显示 GOGETAFS 的元数据 I/O 开销比 Light-Dedup 低 75.4% - 92.8%。这一优化主要来源于 LFP 记录的合并,使得 FP2P 记录不再需要独立写入,而是与文件系统元数据一同持久化。此外,实验还分析了去重带来的 I/O 放大效应。结果表明,在 4KB 块 I/O 的情况下,GOGETAFS 的额外读写开销几乎为零,而 Light-Dedup 需要额外执行 132.2 字节的读操作和 115.6 字节的写操作,导致更高的存储开销。

image-20250319114457019

在不同内存条件下的评估中,GOGETAFS 设计的多个 GLT 变体展现了出色的适应能力。在内存受限环境中(如 PC),GOGETAHYBRID 通过在存储设备中存储指纹值(PBN 和引用计数),而仅在内存中存储指纹键(FP),在减少内存占用的同时,保持了较高的查找效率。而在极端受限的移动环境下,GOGETASHT 采用存储中的静态哈希表,以换取更低的内存消耗,同时优化存储访问路径,使得 I/O 性能仍然优于传统 DedupFS。

image-20250319114731283

在崩溃恢复测试中,GOGETAFS 展示了显著的恢复加速效果。相比于传统 DedupFS 需要遍历所有 L2P 记录来重建 FP2P 表,GOGETAFS 只需扫描 LFP 记录,恢复时间缩短了 50% - 67%。此外,在超低延迟 SSD 上,GOGETAFS 仍然能够保持高吞吐量,并比现有 DedupFS 方案减少 15% - 30% 的元数据维护延迟。

综合来看,GOGETAFS 在吞吐量、元数据管理、内存优化和崩溃恢复方面都比现有 DedupFS 方案有显著优势,使其成为更高效、更可靠的去重文件系统方案。


本站总访问量

本站共发表 112 篇文章 · 总计 389.5k 字
载入天数...载入时分秒...