Cloudflare 将 1.1.1.1 DNS 缓存的内存占用削减了 100TB

文章来源声明: 来源站点:InfoQ 中文; 原文链接:https://www.infoq.cn/article/XWJ8G6GaFmNL74xpSgjU?utm_source=rss&utm_medium=article; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

规模效应下的极致内存优化,Box 替代、位打包、有线格式紧凑缓冲区的思路值得 Rust 高性能与缓存架构团队借鉴;中小规模需权衡装箱带来的局部性损失。

- 2026-10-05北京 - 本文字数:1073 字
阅读完需:约 4 分钟
Cloudflare 通过五轮 Rust 内存表示优化,将 Big Pineapple DNS 缓存单条目内存占用降低 56%,集群释放 100 TB 工作集内存,插入吞吐提升 43%,查询延迟下降 19%。

单条目节省 64 字节源于 Box 替代 Vec/String;合并 DNS 记录为紧凑偏移列表并位打包布尔字段;重构枚举变体以避免装箱导致的局部性退化。

适合 DNS 系统工程师、Rust 高性能系统开发者、大规模缓存架构师阅读。

![](https://static001.infoq.cn/resource/image/52/53/52c371d1b2704f04036176ed47f7ee53.jpg?x-oss-process=image/resize,w_726)
Cloudflare [重新设计](https://blog.cloudflare.com/dns-cache-memory-optimization-1111/)了其 1.1.1.1 解析器所使用的 DNS 缓存的内存表示,将每个条目的基准空间占用减少了 56%,并在整个服务器集群中释放了约 100 TB 的工作集内存。Cloudflare 对 DNS 平台 Big Pineapple 做的这些改动,使缓存插入吞吐量提高了 43%,并将查询延迟降低了 19%。

在任何时刻,Big Pineapple 都存储着超过 2500 亿个 DNS 缓存条目。Cloudflare 系统工程师 Sebastiaan Neuteboom 在 LinkedIn 上这样描述了这一成果:

能节省 100 TB 的内存,这可不是每天都能遇到的。

这项工作对 Rust 的缓存表示形式连续进行了五次迭代优化。Cloudflare 首先将插入后固定不变的数据类型从 Vec 和 String 替换为 Box[T]> 和 Box,使得每个条目节省了 64 个字节,而整个集群累计节省了超过 15 TB 内存。随后,他们将应答(answer)、权限(authority)及其他记录合并为一个带有紧凑偏移量的列表,将布尔值打包成位标志,并省略了与查询域名匹配的所有者名称,转而通过缓存键进行重建。最大的挑战在于 Rust 枚举:Cloudflare 最初尝试对较大的枚举变体进行装箱(boxing),但独立的内存分配不仅增加了开销还降低了内存局部性。

对于这种权衡,一位 Reddit 评论者是这样总结的:

许多这种类型的内存优化技巧只有在达到 Cloudflare 的请求量级别时才能发挥作用;在规模比较小的情况下,将变体进行装箱所造成的额外间接访问,对缓存局部性的损害可能大于其实际益处。

Cloudflare 的最终设计采用 DNS 有线格式,将记录数据存储在连续的字节缓冲区中。这既消除了枚举和按记录分配的开销,又提高了局部性。常用的记录类型还可以直接复制到响应中,而包含域名的记录仍然需进行解析以实现 DNS 名称压缩。

该方法与其他递归 DNS 解析器所采用的缓存架构有所不同。例如,Unbound 维护着独立的消息、RRset、键和负缓存,其缓存大小和分块设置均可配置;而 PowerDNS Recursor 则使用多种缓存类型,包括数据包缓存和记录缓存。相比之下,Cloudflare 的工作重点在于减少单个缓存条目的表示和分配开销。

该优化已于 2026 年 5 月 18 日至 7 月 6 日期间在生产环境中全面部署。在 p99 水平下,每个实例的驻留内存从 9.3 GB 降至 5.3 GB,而在 p90 水平下,内存消耗从 6.5 GB 降至 3.8 GB。

基准测试显示,每个条目的内存占用从 953 字节降到了 420 字节,内存分配从 1.1 KB 降至 461 字节。插入吞吐量提高了 43%,查询延迟降低了 19%。在整个集群中,这些改动释放了约 100 TB 的工作集内存。Cloudflare 计划利用这部分内存来增加缓存容量,而又不增加整体内存消耗。

原文链接:https://www.infoq.com/news/2026/09/cloudflare-dns-cache/