Cloudflare 近期重新设计了 1.1.1.1 解析器所使用的 DNS 缓存内存表示,单个条目的基准空间占用减少了 56%,整个服务器集群因此释放了约 100 TB 的工作集内存。对 Big Pineapple DNS 平台而言,改动还带来了额外红利:缓存插入吞吐量提升 43%,查询延迟下降 19%。
Big Pineapple 在任何时刻都存储着超过 2500 亿个 DNS 缓存条目。Cloudflare 系统工程师 Sebastiaan Neuteboom 在 LinkedIn 上这样形容:
能节省 100 TB 的内存,这可不是每天都能遇到的。
Cloudflare 对 Rust 缓存表示形式连续进行了五轮迭代优化。首先,他们将插入后固定不变的数据类型从 Vec 和 String 替换为 Box<[T]> 和 Box<str>,每个条目省下 64 字节,整个集群累计释放超 15 TB 内存。随后,应答(answer)、权限(authority)及其他记录被合并为一个带紧凑偏移量的列表,布尔值打包成位标志,与查询域名匹配的所有者名称也一并省略,改为通过缓存键重建。
最大的挑战集中在 Rust 枚举上:Cloudflare 起初尝试对较大的枚举变体装箱(boxing),但独立内存分配不仅带来了额外开销,还削弱了内存局部性。
一位 Reddit 评论者对这种权衡的总结是:
许多这类内存优化技巧,只有达到 Cloudflare 的请求量级别才能真正发挥价值;在规模较小时,给变体装箱带来的额外间接访问,对缓存局部性的伤害可能反而大于收益。
最终设计采用了 DNS 有线格式,把记录数据存储到连续字节缓冲区中。这样既去掉了枚举和按记录分配的开销,又改善了局部性。常用记录类型还能直接复制进响应,而包含域名的记录仍需解析,以便完成 DNS 名称压缩。

Cloudflare DNS 缓存使用 DNS 有线格式将记录数据存储为连续字节缓冲区(图片来源:Cloudflare 博客文章)
这套思路与主流递归解析器的缓存架构明显不同。Unbound 维护着独立的消息、RRset、键和负缓存,缓存大小与分块均可配置;PowerDNS Recursor 则依赖数据包缓存、记录缓存等多种缓存类型。而 Cloudflare 把注意力集中在一个更基础的问题上:如何降低单个缓存条目的表示和分配开销。
优化已在 2026 年 5 月 18 日至 7 月 6 日期间于生产环境全面铺开。p99 水平下,每个实例的驻留内存从 9.3 GB 降至 5.3 GB;p90 水平下,内存消耗从 6.5 GB 降至 3.8 GB。

Cloudflare 生产环境内存使用变化(图片来源:Cloudflare 博客文章)
基准测试显示,每个条目的内存占用从 953 字节降至 420 字节,内存分配从 1.1 KB 降至 461 字节。插入吞吐量提升 43%,查询延迟降低 19%。整个集群合计释放了约 100 TB 工作集内存,Cloudflare 的下一步计划是把这部分内存转化为更大的缓存容量,而不再增加总体内存消耗。
原文链接:https://www.infoq.com/news/2026/09/cloudflare-dns-cache/
|