- Published on
优化1.1.1.1 DNS缓存:节省100TB内存的五项Rust级改进
- Authors
- Name
- TangerineDream
- blog.cloudflare.com

引言
Cloudflare 的 Big Pineapple 平台支撑着 1.1.1.1、Gateway DNS、DNS Firewall 等多项 DNS 服务,在任何时刻都存储着超过 2500 亿条 DNS 缓存条目。如此庞大的规模下,每条记录浪费一个字节,整个集群就会多消耗 250 GB 内存。通过五项针对 Rust 数据结构的优化,团队将每条缓存条目的内存占用削减了 56%,在全球数据中心释放了约 100 TB 内存——相当于 130 台第 13 代服务器的内存总量。更令人惊喜的是,缓存性能不降反升:插入吞吐量提升 43%,查找延迟降低 19%。
缓存结构概览
每个缓存条目是一个键值对。键包含查询名称、查询类型、认证标志和标签。值则存储 DNS 响应本身:答案、权威和附加记录段,以及创建时间、命中计数、TTL 等元数据。原始结构使用了 Vec、String 等类型,这些类型在存储后不再需要扩容能力,却保留了容量字段和堆上预留空间,造成大量浪费。
优化一:用 Box<[T]> 替代 Vec
Vec 内部包含指向堆数据的指针、当前长度和容量三个字段。一旦条目存入缓存就不再修改,容量字段毫无用处,却占用 8 字节。此外,Vec 在堆上会预留额外空间(例如容量为 8 但只存 5 个元素,浪费 3 个槽位)。改用 Box<[T]> 后,它不可增长,无需容量字段,堆上也不预留空间。同样,String 替换为 Box<str>。每个缓存条目有 8 个 Vec/String 字段,每个字段节省 8 字节,共 64 字节。加上消除的堆上预留空间,总计节省超过 15 TB 内存。
优化二:合并列表,使用偏移量
原本答案、权威和附加三个记录段各自独立存储为 Box<[T]>,每个需要 8 字节指针和 8 字节长度。实际上,每个段的记录数量不超过 u16 范围(65535),因此可以用两个 2 字节的偏移量来标记各段起始位置。这样移除两个列表,每个节省 16 字节,加上对齐带来的额外收益,每条条目节省 28 字节。同时,将多个布尔字段打包成位标志,进一步减少了结构体填充。
优化三:丢弃重复的域名所有者
每个 DNS 记录都有一个所有者域名。在大多数情况下,所有者与查询域名相同(例如查询 example.com 的 A 记录,返回的两条记录所有者都是 example.com)。只有涉及 CNAME 时,后续记录的所有者才会不同。原始实现为每条记录都存储了完整的所有者域名。优化后,当所有者与查询域名相同时,使用 Option::None 表示,在构建响应时从缓存键中获取;仅当不同时才存储完整域名。由于绝大多数记录所有者与查询域名一致,这避免了大量堆分配。
优化四:枚举变体装箱
DNS 记录类型用枚举表示,例如 A、AAAA、TXT、NAPTR 等。枚举的大小等于最大变体的大小。NAPTR 变体包含三个可变长文本字段、一个域名和两个整数,占用 136 字节,加上标签和对齐后整个枚举达 144 字节。而 A 记录仅需 4 字节,AAAA 需 16 字节,它们占流量的 80% 以上,却被迫为 NAPTR 的尺寸买单。解决方案是将大变体装箱(Box<T>),枚举只存储 8 字节指针,堆上分配实际所需大小。这样 A/AAAA 记录每条节省 120 字节。虽然 NAPTR 等罕见类型会多一次堆分配,但整体收益巨大。
优化五:以 wire format 存储记录
进一步优化是放弃解析后的枚举列表,直接将记录数据编码为字节序列:每条记录用 2 字节长度前缀加上原始字节。这消除了枚举变体的开销和装箱带来的分散堆分配,数据连续存放,提升 CPU 缓存局部性。代价是无法随机索引,需要顺序遍历,但由于每条条目记录数很少,开销可忽略。构建 DNS 响应时,大多数记录类型可直接从缓冲区复制到出站消息,避免了序列化开销。
性能与结果
团队使用自定义分配器跟踪每条条目的分配次数和大小,并在生产环境中测量常驻内存。最终每条条目内存占用降低 56%,插入吞吐量提升 43%,查找延迟降低 19%。这些优化没有牺牲速度,反而因为更少的分配和更好的内存局部性而加速。
总结
Cloudflare 通过五项 Rust 级优化,在 2500 亿条 DNS 缓存条目规模下节省了 100 TB 内存。这些优化展示了在极端规模下,对数据结构细节的极致打磨能带来巨大收益。核心思路包括:移除不必要的容量字段、合并冗余列表、利用模式推断省略重复数据、对大变体装箱、以及使用紧凑的 wire format 存储。这些方法不仅适用于 DNS 缓存,也为其他高吞吐、低延迟系统提供了参考。
原标题:Saving 100 terabytes of memory by optimizing 1.1.1.1's DNS cache。 HN 原始发布时间:2026年8月28日星期五。当前记录为 886 分、278 条评论。