省下 100TB 内存,靠的不是换更贵的硬件,而是删掉几个字段。 Cloudflare 在官方博客里公布了对 1.1.1.1 DNS 缓存的数据结构优化,净迁移后省下了约 100TB 的内存。这是目前全球最大的公共 DNS 解析器之一,缓存条目以亿计,任何微小的每条目开销都会被规模放大。 第一个改动是最典型的 Rust 陷阱:把 Vec<T> 换成 Box<[T]>。Vec 需要维护一个 capacity 字段,在只读缓存这种永远不会再增长扩容的场景里,这个 8 字节的容量字段完全派不上用场,却为每个条目白白付出。Box<[T]> 丢弃了 capacity 的语义,正好匹配"存进去之后只读"的用法。 第二个改动砍掉了重复序列化。缓存会存储已经序列化好的 DNS 记录,避免每次查询都重新做一遍序列化与反序列化——这部分 CPU 开销在原来也一直被重复支付。 第三个是去重。DNS 查询名里的 owner 信息在不同记录之间大量重复,把它们抽出来共用,而不是每个记录各存一份。 三处改动单看都不起眼,加起来在数亿级条目上就变成了 100TB 这个数字。 不过有用户尖锐地指出,当初设计的时候难道没有 code review 发现 Vec 的 capacity 在只读场景是浪费的吗?这引出了一场关于"过早优化"和"合理设计"边界的老话题。也有人给出了一个更冷静的顺序判断:先做出能跑的产品、验证想法、稳定业务、开始盈利,之后才轮到优化成本——"优化其实是整个过程里最简单的部分。" 参考来源: https://blog.cloudflare.com/dns-cache-memory-optimization-1111/ https://news.ycombinator.com/item?id=49468083
省下 100TB 内存:Cloudflare 如何给 1.1.1.1 的 DNS 缓存做减法
来源:开源中国
2026年08月31日 16:01
0 阅读
分享到: