本文介绍了字节跳动基础设施团队与清华大学合作提出的 DisCoGC 架构,这是一种融合 Discard 和 Compaction 的全新垃圾回收范式,旨在解决 EB 级分布式日志结构存储中写放大与空间放大的权衡难题,已在生产环境中实现 TCO 降低 20%。
📝 详细摘要
文章详细解读了字节跳动基础设施团队与清华大学合作、被 FAST‘26 收录的论文《Discard-Based Garbage Collection for Distributed Log-Structured Storage Systems in ByteDance》的核心技术与工程实践。针对支撑字节跳动 EB 级数据的自研分布式存储系统 ByteStore 面临的经典难题——日志结构存储中垃圾回收带来的写放大与空间放大权衡,团队通过分析海量生产 IO Trace,发现主流业务场景中超过 90% 的无效数据是长连续范围。基于此洞察,他们提出了 DisCoGC 架构,核心思想是放弃以 Compaction 为主的传统 GC 模式,转而以 Discard 操作为主力直接回收长连续无效数据,从根本上避免有效数据的重写以消除写放大,同时辅以低频 Compaction 回收碎片化数据。文章深入阐述了工程落地中解决跨层边界损耗、避免前台业务冲击、管理碎片化与元数据膨胀、适配底层 SSD Trim 硬件等挑战的具体方案。最终,DisCoGC 在字节大规模生产集群全量部署,实现了约 20% 的存储系统 TCO 降低,且对前台业务性能零影响。
💡 主要观点
- 通过分析 PB 级生产 Trace,发现主流业务场景的无效数据多为长连续范围,这是设计新 GC 范式的关键洞察。 团队对在线服务、搜索广告推荐、离线计算三大场景进行全量 IO Trace 分析,发现超过 70% 的写入流量会产生长连续无效数据,这为直接 Discard 而非搬运数据的方案提供了数据支撑。
💬 文章金句
- 传统 Compaction 为了回收这 80% 的无效空间,必须把那 20% 的有效数据读出来、重新写一遍,为了回收垃圾,反而产生了大量的额外写入,这正是写放大的核心来源。
- 既然无效数据是连续的,我们为什么非要去搬运那一小部分有效数据?为什么不能直接把这段连续的无效空间标记回收,完全不动有效数据?
- 用 Discard 机制直接回收长连续的无效数据,从根源上避免有效数据的重写,写放大自然就消失了;再用低频的 Compaction 做兜底,回收碎片化的无效数据,解决 Discard 带来的碎片化问题。
- 在字节的超大规模体量下,哪怕是 10% 的空间放大,都会转化成巨额的硬件成本浪费。
- DisCoGC 能自动适配不同的业务负载,在极低的写放大下,实现高效的空间回收,大幅降低了运维成本。
📊 文章信息
AI 初评:92
来源:字节跳动技术团队
作者:字节跳动技术团队
分类:软件编程
语言:中文
阅读时间:29 分钟
字数:7239
标签: 分布式存储, 垃圾回收, 日志结构存储, 字节跳动, 系统优化