首页 > 开源 > 省下 100TB 内存:Cloudflare 如何给 1.1.1.1 的 DNS 缓存做减法

省下 100TB 内存:Cloudflare 如何给 1.1.1.1 的 DNS 缓存做减法

OSChina资讯 2026-08-31 15:33 1 阅读 查看原文

省下 100TB 内存,靠的不是换更贵的硬件,而是删掉几个字段。

Cloudflare 在官方博客里公布了对 1.1.1.1 DNS 缓存的数据结构优化,净迁移后省下了约 100TB 的内存。这是目前全球最大的公共 DNS 解析器之一,缓存条目以亿计,任何微小的每条目开销都会被规模放大。

cover

第一个改动是最典型的 Rust 陷阱:把 Vec<T> 换成 Box<[T]>Vec 需要维护一个 capacity 字段,在只读缓存这种永远不会再增长扩容的场景里,这个 8 字节的容量字段完全派不上用场,却为每个条目白白付出。Box<[T]> 丢弃了 capacity 的语义,正好匹配"存进去之后只读"的用法。

第二个改动砍掉了重复序列化。缓存会存储已经序列化好的 DNS 记录,避免每次查询都重新做一遍序列化与反序列化——这部分 CPU 开销在原来也一直被重复支付。

第三个是去重。DNS 查询名里的 owner 信息在不同记录之间大量重复,把它们抽出来共用,而不是每个记录各存一份。

三处改动单看都不起眼,加起来在数亿级条目上就变成了 100TB 这个数字。

不过有用户尖锐地指出,当初设计的时候难道没有 code review 发现 Vec 的 capacity 在只读场景是浪费的吗?这引出了一场关于"过早优化"和"合理设计"边界的老话题。也有人给出了一个更冷静的顺序判断:先做出能跑的产品、验证想法、稳定业务、开始盈利,之后才轮到优化成本——"优化其实是整个过程里最简单的部分。"

参考来源: