2026 08 29 HackerNews

💡 原文中文,约28900字,阅读约需69分钟。
📝

内容提要

Cloudflare优化DNS缓存,通过五项措施使每个条目内存占用减少56%,节省约100TB内存。这些措施包括替换数据结构、合并存储列表、省略冗余字段、使用Box减少枚举浪费及原始字节存储,从而提升性能并降低内存使用。

🔎

延伸解读

内存优化的工程启示

Cloudflare 通过五项措施将 DNS 缓存条目内存占用减少 56%,节省约 100TB 内存。这些优化包括用 Box 替换 Vec/String 以消除冗余容量字段、合并存储列表、省略冗余字段、用 Box 减少枚举浪费,以及采用原始字节存储。这展示了在超大规模系统中,看似微小的内存节省(如每条目 8 字节)也能累积成巨大收益,同时提升性能。

优化时机与业务权衡

HN 评论指出,软件交付应先做产品、验证想法、稳定业务,再优化成本。优化本身相对容易,但改变生产环境中的热路径数据结构风险高,需谨慎推出。Cloudflare 的优化耗时 4 个月,主要挑战在于协调部署和推动工程师采用演进式数据结构思维。这提醒开发者,过早优化可能适得其反,而成熟后的优化需充分测试。

DNS 缓存与 ECS 的挑战

文章提到,使用 EDNS Client Subnet(ECS)时,需要缓存多个版本的相同查询结果,这增加了缓存条目数量和内存消耗。因此,优化内存对支持 ECS 的 DNS 服务尤为重要。这解释了为何 Cloudflare 在 Big Pineapple 平台上投入大量精力优化缓存结构,以在保持功能的同时降低资源占用。

Q&A

Cloudflare 如何通过优化 DNS 缓存节省约 100TB 内存?

Cloudflare 通过五项措施优化 1.1.1.1 的 DNS 缓存,使每个缓存条目的内存占用减少 56%,累计节省约 100TB 内存。这些措施包括:用 Box<[T]> 和 Box<str> 替换 Vec 和 String 以去除冗余容量字段;将答案、授权和附加记录合并为单一列表并用偏移量引用;省略与查询域名相同的记录拥有者字段;将枚举中的大型变体用 Box 放到堆上以减少内存浪费;以及将 DNS 记录以原始字节存储以提升内存局部性。

Cloudflare 优化 DNS 缓存后,内存使用量具体下降了多少?

优化后,生产环境中 99 分位的内存使用从 9.3GB 降至 5.3GB,降幅达 43%。同时,插入吞吐量和查找速度也有所提升。

Cloudflare 优化 DNS 缓存时,为什么需要特别关注 EDNS Client Subnet(ECS)?

使用 ECS 时,需要缓存多个版本的相同查询结果,这会增加缓存条目的数量及其内存消耗,因此对内存优化的需求尤为迫切。

Cloudflare 优化 DNS 缓存时,如何减少枚举类型的内存浪费?

Rust 的枚举类型在不同变体之间占用的内存相同,导致小型记录类型浪费内存。Cloudflare 将较大的变体数据通过 Box 放到堆上,从而避免内存浪费。

Cloudflare 优化 DNS 缓存时,为什么将 DNS 记录以原始字节存储?

将 DNS 记录以原始字节存储而不是解析后的结构化字段,可以提升内存局部性并减少查找延迟,从而提升性能。

Cloudflare 优化 DNS 缓存时,如何减少列表存储的内存开销?

Cloudflare 将答案、授权和附加记录存储在一个单一的列表中,并使用偏移量指向各个部分,而不是分开存储多个列表,从而大幅减少每个条目的内存开销。

🏷️

标签

➡️

继续阅读