Slide: View the slides
论文提出了一种新的去重文件系统 GoGetaFS,它通过合并去重元数据和文件系统元数据,减少了维护去重元数据所需的额外I/O操作和排序开销。作者通过一系列技术来管理数据和元数据,使得 GoGetaFS 在保持兼容性的同时,实现了高效和1️⃣节省内存的去重功能。实验表明,GoGetaFS 在各种工作负载下都优于现有的去重文件系统,并且能够2️⃣显著减少元数据维护开销。
Background
重删有两类系统:
- 独立去重系统(Stand alone Deduplication System):通常作为文件系统之上的独立层运行,管理指纹索引来检测冗余数据
- 去重文件系统(Deduplication File System, DedupFS):将数据去重直接集成到文件系统的方案,旨在消除独立去重系统的冗余元数据维护问题。
独立去重系统
独立去重系统 是目前最常见的去重存储解决方案。
它有两个关键数据映射表:
- L2P(Logical-to-Physical)
- FP2P(Fingerprint-to-Physical)
流程:
- 数据写入:计算数据块的加密指纹。在 FP2P 表中查找该指纹:
- 若 已存在,则 更新引用计数,避免写入新数据。
- 若 不存在,则 插入新的 FP2P 记录 并写入数据块。
- 数据读取:通过 L2P 表找到 PBN,并返回对应数据。
- 数据删除
- 先删除 L2P 记录,然后减少 FP2P 表中的引用计数。
- 如果引用计数变为 0,则释放物理块。
元数据管理:
- 由于去重会将多个逻辑块映射到同一个物理块,系统必须保证 FP2P 映射的崩溃一致性(Crash Consistency)
- 现有方法:
- 日志记录(Write-ahead Logging):先将 FP2P 变更记录写入日志区(但不立刻生效),当 L2P 也持久化后,才将 FP2P 变更正式写入元数据。
- 写时复制(Copy-on-Write)
- 软更新(Soft Updates):在元数据写入前,记录 FP2P 依赖关系,并确保 FP2P 先更新,L2P 后更新。
独立去重系统的问题
- 额外的元数据维护
- 独立去重系统需要 单独维护 L2P 和 FP2P,增加了 额外的 I/O 负担。
- 写入路径涉及两次 I/O(一次 L2P,一次 FP2P),影响性能。
- 数据一致性问题
- FP2P 映射需要独立存储,如果 崩溃发生在 FP2P 和 L2P 更新之间,会导致数据不一致。
- 需要额外的恢复机制 来修复 FP2P 记录和 L2P 记录的不一致情况。
- 高计算开销:传统去重使用加密指纹(如 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 顺序写入负载。
在 0% 去重比率下,所有 DedupFS 的性能都低于 Ideal-Dedup。
- 原因:DedupFS 在每次写入时都需要计算指纹(FP)并查询 FP2P 表,而 Ideal-Dedup 仅执行基本的文件系统操作。
随着去重比率的增加,理论上 DedupFS 性能应该逐步接近 Ideal-Dedup,但 实验结果显示,性能差距并未明显缩小。
- 疑问:既然 FP 计算和去重减少了数据写入,为什么吞吐量没有提升?
Observation 2:重复数据删除元数据维护是主要瓶颈
论文分析了 DedupFS 开销的五个主要组成部分(Breakdown):
- Dup Identify(去重识别):计算指纹、查找 FP2P 表、内容比对
- Dedup Metadata(去重元数据维护):记录/更新 FP2P 映射
- Data Write(数据写入):将数据块写入存储
- FS Metadata(文件系统元数据维护):更新 L2P(逻辑到物理)映射
- Others(其他开销):VFS、垃圾回收、块分配等
去重元数据维护开销占 I/O 时间的 18% - 38%,成为影响 DedupFS 性能的主要瓶颈。
- 原因:
- 额外的崩溃一致性(crash consistency)开销:传统 DedupFS 需要在 写入 L2P 之前 确保 FP2P 表的持久化,以保证一致性。
- 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)
- 不同的元数据管理策略
GOGETAFS 在数据管理方面解决了传统 DedupFS 与文件系统在数据组织上的不兼容问题。DedupFS 传统上以块为单位进行去重,而文件系统通常以 extent(连续块)方式管理数据。为此,GOGETAFS 采用了两种策略:
- 一种是利用超指纹(Super-Fingerprint, SFP)对整个 extent 进行指纹计算,但这种方式降低了去重比率,并增加了串行化计算带来的并行性问题。因此,GOGETAFS 选择了更优的方案,即使用溢出 FP 表(OFT),将连续块的指纹存储到一个额外的存储区域,从而避免 LFP 记录的可变长度问题,同时保持了指纹计算的并行性。OFT 的设计基于存储分配的空间局部性,使其能够高效地管理指纹数据,并且在文件删除时不需要额外的清理操作,因为未被 LFP 记录引用的 OFT 条目可以被安全覆盖。
在元数据管理方面,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
GOGETAFS 的评估基于多个真实世界的工作负载和合成基准测试,涵盖了不同的存储场景,如服务器、PC 和移动设备。实验环境包括 Intel Xeon 服务器,配置有 512GB Optane DCPMM 和 128GB DRAM,并运行 CentOS Stream 5.1 内核。此外,还在 Z-SSD 模拟环境下对 GOGETAFS 进行了额外测试,以验证其在超低延迟 SSD(ULL SSD)上的表现。
在基本 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 仍然具有明显的性能优势。
在元数据维护开销分析中,实验结果显示 GOGETAFS 的元数据 I/O 开销比 Light-Dedup 低 75.4% - 92.8%。这一优化主要来源于 LFP 记录的合并,使得 FP2P 记录不再需要独立写入,而是与文件系统元数据一同持久化。此外,实验还分析了去重带来的 I/O 放大效应。结果表明,在 4KB 块 I/O 的情况下,GOGETAFS 的额外读写开销几乎为零,而 Light-Dedup 需要额外执行 132.2 字节的读操作和 115.6 字节的写操作,导致更高的存储开销。
在不同内存条件下的评估中,GOGETAFS 设计的多个 GLT 变体展现了出色的适应能力。在内存受限环境中(如 PC),GOGETAHYBRID 通过在存储设备中存储指纹值(PBN 和引用计数),而仅在内存中存储指纹键(FP),在减少内存占用的同时,保持了较高的查找效率。而在极端受限的移动环境下,GOGETASHT 采用存储中的静态哈希表,以换取更低的内存消耗,同时优化存储访问路径,使得 I/O 性能仍然优于传统 DedupFS。
在崩溃恢复测试中,GOGETAFS 展示了显著的恢复加速效果。相比于传统 DedupFS 需要遍历所有 L2P 记录来重建 FP2P 表,GOGETAFS 只需扫描 LFP 记录,恢复时间缩短了 50% - 67%。此外,在超低延迟 SSD 上,GOGETAFS 仍然能够保持高吞吐量,并比现有 DedupFS 方案减少 15% - 30% 的元数据维护延迟。
综合来看,GOGETAFS 在吞吐量、元数据管理、内存优化和崩溃恢复方面都比现有 DedupFS 方案有显著优势,使其成为更高效、更可靠的去重文件系统方案。