背景与规模

Cloudflare 的 Big Pineapple 平台支撑 1.1.1.1、Gateway DNS、DNS Firewall、AS112 等 DNS 服务,常驻缓存条目超过 2500 亿条。在该规模下,单条缓存每浪费 1 字节,全集群便会多耗 250GB 以上内存。

优化措施与收益

团队对缓存内存布局做了五次连续改动,将单条记录占用压缩超过 50%,全集群释放约 100TB 内存(约等于 130 台 Gen 13 服务器 RAM),同时因分配更少、内存局部性更好,插入吞吐提升 43%,查询延迟下降 19%。

主要技术手段

  • Box<[T]>Box<str> 替代不可变的 Vec<T>String,省去 capacity 字段及预留堆空间,每记录约省 64 字节。
  • 将 answer/authority/additional 三段由独立列表改为单列表加 u16 偏移量,去掉多余指针与长度,省 28 字节;并将多个布尔字段压成位标志,减少对齐填充。
  • 多数记录 owner 与查询域名相同,读取时从 key 推断并省略存储;仅 CNAME 等差异场景保留完整名,避免多数堆分配。
  • 对 DNS 记录枚举的大变体做 boxing,使 A/AAAA 等小记录不再因最大变体(如 NAPTR 144 字节)而填充浪费,单记录可省超 120 字节。

评测方式

使用包装 Rust System allocator 的自定义分配器,按生产流量分布(A 56%、AAAA 25%、TXT 19%)填充随机条目,统计每记录分配与大小,并观测插入吞吐与查询延迟;灰度期间同时采集线上实例常驻内存。

对读者的意义 / 技术解读

对于自研或运维高性能 DNS 递归/权威缓存、以及任何“海量小对象 + 不可变”场景的 SRE 与开发者,本案例提供了可复用的优化思路:在对象写入后不再变更时,应放弃带容量字段的动态容器;善用偏移与 key 推导消除冗余存储;通过 boxing 大变体规避枚举内存膨胀。在亿级条目规模下,这类“每一字节”的权衡可直接转化为可观的硬件成本下降与延迟改善,而不必牺牲吞吐。