Cloudflare 宣布了对 Big Pineapple 平台 DNS 存储进行一系列底层优化的结果。该平台运行着 1.1.1.1、Gateway DNS、DNS Firewall、AS112 以及其他多项 DNS 服务。平台随时存储超过 2500 亿条 DNS 记录,因此每条记录减少 1 个字节,就能在整个集群层面节省超过 250 GB 的内存。
用 Rust 编写的数据结构经过连续五项改动后,单条记录的大小从 953 字节降至 420 字节,降幅为 56%。这些改动全面部署后,Cloudflare 整个集群所使用的工作集内存减少了约 100 TB,同时性能不但没有牺牲,反而得到提升:记录插入速度提高了 43%,存储查找延迟降低了 19%。
为什么 DNS 记录的大小很重要?
Big Pineapple 在启动时从空存储开始,随后随着查询到达而逐渐填充,直到达到上限,之后移除最旧或最少使用的记录。不同数据中心的存储大小各不相同,而使用 EDNS Client Subnet 还可能导致同一查询存储多个答案,因为权威服务器可能根据客户端网络提供不同的答案。
每条记录由一个键和一个值组成。键用于确定域名、记录类型及一些属性;值包含 DNS 答案、authority 和 additional 部分,以及创建时间、使用次数计数器和 TTL 时长等元数据。在这一规模下,多余字段或预留空间不再只是微小的内部细节,而会转化为巨大的运营成本。
节省来自哪里?
Cloudflare 在存储响应后,将可增长的 Vec 和 String 结构替换为固定大小的 Box<[T]> 和 Box<str>,因为这些数据之后不会再被修改。这一改动移除了可增长结构保留的容量字段,也限制了未使用的预留空间。由于每条记录包含 8 个此类字段,因此每条记录节省了 64 字节,整个存储节省了超过 15 TB。
Cloudflare 还将答案、authority 和 additional 部分的列表合并为一个列表,并使用 u16 类型的偏移量,而不是更大的指针和长度。这样每条记录节省了 28 字节。该结构还通过将多个布尔字段压缩到一个 bitflag 中,减少了 Rust 在结构内部强制进行内存对齐所造成的空间浪费。
在大多数 DNS 记录中,记录所有者与所查询的域名相同。因此,在这些情况下,Cloudflare 不再完整存储所有者名称,而是在构建答案时从存储键中恢复该名称。当名称不同时,例如 CNAME 记录,则存储完整名称。这样便消除了大多数所有者名称的内存分配,同时保留了确实需要名称的情况。
降低大型记录类型的成本
RecordData 结构使用的 enum 大小等于最大记录类型的大小;在计算标签和对齐后,最大类型 NAPTR 的大小为 144 字节。因此,只需要 4 字节的 A 记录和需要 16 字节的 AAAA 记录占用了远超其实际需求的空间,尽管 A 和 AAAA 占测试流量的 80% 以上。
团队曾尝试将大型类型放入单独的 Box 中,这降低了 A 和 AAAA 记录的浪费,但增加了独立分配,并带来了内存 locality 问题。最终方案是将记录数据本身作为连续的原始字节存储在 Box<[u8]> 中,每条记录使用 2 字节的长度前缀。这样消除了 enum 成本和多次分配,并改善了处理器对存储缓存的利用。
这一选择意味着记录不再支持随机索引,而必须按顺序遍历。Cloudflare 认为,由于单条记录中的记录数量很少,因此成本有限。大多数类型,包括 A、AAAA、TXT 和 DNSSEC 记录,都可以直接复制到输出 DNS 消息中;而包含域名的类型,例如 CNAME、NS、MX 和 SOA,仍需要解析,以应用 DNS 名称压缩。
实际发生了哪些变化?
生产测量显示,第 99 百分位的常驻内存从 9.3 GB 降至 5.3 GB,降幅为 43%;第 90 百分位则从 6.5 GB 降至 3.8 GB,降幅为 42%。每条记录的分配量从 1.1 KB 降至 461 字节;同时,插入速度从每秒 625,000 条记录提高到每秒 893,000 条,查找延迟则从 828 纳秒降至 670 纳秒。
这些改动于 2026 年 5 月 18 日开始推出,并于 2026 年 7 月 6 日在所有服务中完成部署。Cloudflare 说明,生产环境中的常驻内存还包括存储之外的其他数据,因此进程层面的实际降幅低于针对单条记录的隔离测量结果。公司还计划将释放出的内存重新用于提高存储容量,而不增加内存消耗,以改善缓存命中率并减少发送到上游服务器的查询。
这一案例的重要性在于,它说明当服务处理数千亿个元素时,移除不必要的容量、合并分配和改善 locality 等数据结构优化,所产生的影响可能大于直接增加硬件资源。不过,一些权衡仍然存在:原始存储增加了处理记录的复杂性;重建所有者名称时必须从存储键中恢复名称;此外,测试结果依赖于特定的流量组合,并不能完全代表生产环境。因此,在评估此类优化时,生产测量仍然比单独的理论数字更重要。