每日严选
Hacker News
Hacker NewsTangerineDream

省下 100TB 内存的五个歪招Saving 100 terabytes of memory by optimizing 1.1.1.1's DNS cache

TL;DR

Cloudflare 通过一系列内存优化手段,在不牺牲性能的前提下,将 DNS 缓存的每条记录占用空间削减过半,累计省下约 100 TB 内存。

Cloudflare 的 DNS 服务 Big Pineapple 缓存着超过 2500 亿条记录。每条记录多花 1 字节,全网就要多烧 250 GB 内存。

工程师用五个优化把每条记录的占用从 953 字节砍到 420 字节,省下的内存相当于 130 台服务器的内存总量。而且缓存还变快了:插入速度提升 43%,查询延迟降低 19%。

别给不用的东西留位置

缓存里的记录存好后就不再改了,但原来的代码用 Vec 存数据,它自带一个容量字段,还得预留多余空间。换成 Box 后,这些开销全省了。

每条记录存 8 个这样的字段,每个省 8 字节,总共省下 64 字节。此外把多个布尔值合并成一个位标志,顺手消掉不少填充字节。

谁把主人名字存了那么多份

每条 DNS 记录都带一个“主人”名字,但大多数时候主人就是查询的域名。工程师干脆不存了,等读取时再从缓存键里复原——省掉一次堆分配。

只有少数记录(比如 CNAME 背后的 A 记录)需要保留完整主人名,但这类记录占比很小。

大枚举是个内存黑洞

DNS 记录类型用枚举表示,但枚举大小等于最大的变体。NAPTR 记录要占 144 字节,可 A 记录只用 4 字节。偏偏 A 和 AAAA 占了 80% 的流量,大部分空间都白白浪费。

工程师把大记录类型装箱推到堆上,小类型直接内联,一条 A 记录立刻省下 120 字节。

干脆用回原始格式

枚举和装箱都有开销。最狠的一招是把记录直接存成原始字节:一个 2 字节长度前缀加一串二进制数据,堆分配从每个记录一次变成每条记录一次。

数据紧凑排列,CPU 缓存命中率更高,查询时还能直接复制字节出去拼响应,省掉重新序列化的功夫。

这套优化落地后,单条记录占用降了 56%,整个集群内存用量少了 100 TB。省出来的内存还能用来加大缓存容量,进一步提升命中率。

一句话:省内存不是抠门,是给缓存扩容腾地方。

看原文 →
分享到

你可能还想读

每天 5 篇真正值得读的文章

从全球优质信息源中筛选,几分钟了解当天最值得关注的观点。

每日严选

每天 5 篇真正值得读的文章

从全球优质信息源中筛选,几分钟了解当天最值得关注的观点。

当天全部文章2026-08-28 · 共 21 篇