vlog
← 返回全部文章

Tech

一条 DNS 缓存记录瘦身 56%,全球省出 100TB:把数据的形状改对了,省内存反而更快

2026年8月28日 · 吴军《数学之美》~1 min read

2,500 亿条缓存记录,每条多浪费 1 个字节,全球就得多烧 250 GB 内存。Cloudflare 在 2026-08-27 的工程博客里算的就是这笔账:他们把 1.1.1.1 公共解析器背后那套 DNS 缓存的单条记录,从 953 字节压到 420 字节,全球机群省出约 100 TB。你以为这是纯抠门?插入吞吐还涨了 43%。省着省着,反而快了。

30 秒读懂
1数量级

在 2,500 亿条记录面前,1 个字节就是 250 GB,这道乘法比任何算法都硬

这事的起点就一道小学乘法。

1.1.1.1 是 Cloudflare 的公共 DNS 解析器,背后那套缓存系统内部代号叫 Big Pineapple,全球同时保有超过 2,500 亿条缓存记录。这个量级下,单条记录浪费 1 个字节,全球就多耗 250 GB 以上。你别看 953 字节一条不起眼,搁家用电脑上连个响都听不见;乘上 2,500 亿,它就是按机柜算的真金白银。这也是这类系统抠字节的正当性所在:别处的优化论毫秒,这里的优化直接论吨。

⚡

为什么值得看:这篇博客在 Hacker News 上拿了约 455 分、128 条评论。热闹的点倒不在省钱本身:它证明了一件反直觉的事,把内存布局改对,省和快可以同时拿。

《数学之美》里吴军反复讲一个朴素的道理:信息的表示与编码,决定一个系统的成本;微小的量乘上巨大的倍数,就是宏观的量。DNS 缓存恰好是这句话的极端案例。

2找浪费

浪费不在业务逻辑里,藏在容量字段、8 字节指针和 padding 的缝里

拆开一条 953 字节的记录,真正的 DNS 数据没多少,架子占了大头。

头一号浪费是 Rust 的 Vec 和 String。这俩为了支持「以后往里加东西」,都带着容量字段。可缓存记录写入之后从不修改,这个「以后」永远不会来,每条白占 64 字节。第二号是指针:answer、authority、additional 三张记录表各自为政,表间引用走 8 字节指针。第三号最冤:枚举里块头最大的变体把小变体也撑大了,一条 A/AAAA 记录光 padding 就浪费 120 多字节。

打个比方

这就像搬家打包,每个纸箱只装一半,留一半空着「以防以后再塞点什么」。可这些箱子封箱就直接进仓库,永远不再打开。一间房这么干无所谓,两千五百亿个箱子这么干,仓库就得多盖一片。

我对这种看不见的浪费有点条件反射。2024 年我给自己 SaaS 的登录页接过一个免费防刷脚本,发小阿坤抱怨说后台一开,他笔记本风扇就起飞。我开着任务管理器晾了一小时才看见:GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹。单看一下没什么,架不住它一直跳。字节的事一个样:单条 64 字节没人当回事,乘上量,机房的「风扇」就起飞了。

3五步瘦身

五步没有一步是高深算法,全是把数据的形状改成「写死不再动」

Cloudflare 的改法一步比一步彻底,最后一步干脆把结构体扔了。

步骤改什么省多少
① 换容器Vec/String 换成 Box<[T]>/Box<str>,砍掉容量字段64 字节/条
② 并表answer/authority/additional 三张表并成一张,8 字节指针换 2 字节 u16 偏移28 字节/条
③ 省域名记录 owner 域与查询域名相同时直接省略(Option<Box<Name>>)视记录而定
④ 枚举装箱大变体装箱,A/AAAA 不再替别人的块头买单120+ 字节 padding
⑤ 存原始字节记录数据直接存 DNS wire format:单块 Box<[u8]>,每条 2 字节长度前缀+原始字节结构体开销归零

合起来:单条 953 字节到 420 字节,降 56%;堆分配 1.1 KB 到 461 字节,降 58%。说白了思路就一条:这数据这辈子不改了,那就按「不改」的样子长。

SAME CACHE ENTRY: 56% SMALLER, AND FASTER TOObeforeafterMemory / entry953 B420 B−56%Insert rate625K/s893K/s+43%Lookup latency828 ns670 ns−19%RAM p999.3 GB5.3 GB−43%× 250 billion entries ≈ 100 TB freed
Source: Cloudflare engineering blog (2026-08), on the 1.1.1.1 DNS cache. Shrinking each cache entry by 56% made the pipeline faster, not slower — and freed about 100 TB of memory across the global fleet.
4反而快

省内存反而更快:热路径是「读缓存、序列化回报文」,存原始字节等于提前把活干完了

最漂亮的不是第五步省了多少,是它顺手把最热那条路修直了。

旧布局

网络进来的本来就是 wire format,先解析成漂亮的结构体存着;查询命中时,再把结构体序列化回 wire format 发出去。拆一遍、拼一遍,两头的活全干了,图啥?

新布局

缓存里躺的就是 wire format 原始字节,命中时基本一次拷贝完事。当年解析那一遍,本来就是白干。

另一半功劳是缓存局部性:一条记录从东一块西一块的堆分配,变成挤在一起的连续字节,CPU 预取不扑空。数字摆在这儿:

单条足迹
−56%
插入吞吐
+43%
查询延迟
−19%
单机 p99 内存
−43%

口径:插入 62.5 万→89.3 万条/秒;延迟 828→670 纳秒;p99 常驻内存 9.3 GB→5.3 GB,均出自 Cloudflare 原文基准。

5杠与权衡

HN 吵的三根杠都在理,但代价这一栏 Cloudflare 也没藏着

128 条评论里,真正有营养的是三根杠。

第一根:「2,500 亿条还叫缓存吗?这规模更像一个数据库。」名字随你叫,工程约束是真的:数据库级的量,缓存级的延迟要求,两头都得伺候。第二根最有意思:有人点破,解析得更「丰富」的内存表示未必更快,热路径上要的是字节,你偏先加工成结构体,回头还得拆回去。好比饭馆把整条鱼片好了摆盘,客人要的却是整条打包。第三根扎心:「Vec 容量字段这种浪费,当初设计评审怎么没抓住?」我看没什么好嘲的,953 字节在评审桌上真不算事,它是在 2,500 亿这个乘数下才变成事的。数量级变了,对错得重算。

权衡也明摆着:wire format 放弃了随机索引,想找某条记录只能顺序遍历,好在单个应答里记录数少,代价可忽略;另外 jemalloc 按 size class 取整,40 字节的 MX 记录仍会被取整到 48 字节,零头省不干净。
6带走

你系统里也有这本账:先找数量最大的那类对象,再量它的形状

这套打法没有 Cloudflare 的规模也成立,需要的只是那道乘法。

照方抓药的话:找出你系统里数量最大的那类对象,缓存条目、消息、订单行都行,量一下单条实际占多少,然后问三个问题。它写入后还改不改?不改,容量字段和预留空间全是白占。它里头的指针指向的东西,能不能内联进来?它的枚举里最大的变体有多大,是不是让所有小变体陪着买单?也别抄作业抄过头:这五步成立的前提是「写入后从不修改」,你的数据要是天天在改,容量字段和预留空间就不叫浪费,叫本分。

核心

顺序别搞反:先算乘数,再抠字节。2,500 亿条面前,1 个字节是 250 GB;一千条面前,抠出花来也没几个钱。抠之前先确认你抠的东西够多。

吴军说简单是工程之美,这案子给这句话添了个注脚:五步里没有一步用到新算法,全是把数据的表示改得跟它的生命周期对上。至于省和快能不能兼得,答案取决于你省掉的那部分,是不是热路径上本来就要绕的弯路。

取材声明:本文思想框架取材自吴军《数学之美》(信息的表示与编码决定系统成本、数量级思维、简单是工程之美);事件与全部数字出自 Cloudflare 工程博客(2026-08-27)及 Hacker News 相关讨论,技术细节以 Cloudflare 原文为准。本文为技术科普解读。

技术

一条 DNS 缓存记录瘦身 56%,全球省出 100TB:把数据的形状改对了,省内存反而更快

2026年8月28日 · 吴军《数学之美》约 6 分钟

2,500 亿条缓存记录,每条多浪费 1 个字节,全球就得多烧 250 GB 内存。Cloudflare 在 2026-08-27 的工程博客里算的就是这笔账:他们把 1.1.1.1 公共解析器背后那套 DNS 缓存的单条记录,从 953 字节压到 420 字节,全球机群省出约 100 TB。你以为这是纯抠门?插入吞吐还涨了 43%。省着省着,反而快了。

30 秒读懂
1数量级

在 2,500 亿条记录面前,1 个字节就是 250 GB,这道乘法比任何算法都硬

这事的起点就一道小学乘法。

1.1.1.1 是 Cloudflare 的公共 DNS 解析器,背后那套缓存系统内部代号叫 Big Pineapple,全球同时保有超过 2,500 亿条缓存记录。这个量级下,单条记录浪费 1 个字节,全球就多耗 250 GB 以上。你别看 953 字节一条不起眼,搁家用电脑上连个响都听不见;乘上 2,500 亿,它就是按机柜算的真金白银。这也是这类系统抠字节的正当性所在:别处的优化论毫秒,这里的优化直接论吨。

⚡

为什么值得看:这篇博客在 Hacker News 上拿了约 455 分、128 条评论。热闹的点倒不在省钱本身:它证明了一件反直觉的事,把内存布局改对,省和快可以同时拿。

《数学之美》里吴军反复讲一个朴素的道理:信息的表示与编码,决定一个系统的成本;微小的量乘上巨大的倍数,就是宏观的量。DNS 缓存恰好是这句话的极端案例。

2找浪费

浪费不在业务逻辑里,藏在容量字段、8 字节指针和 padding 的缝里

拆开一条 953 字节的记录,真正的 DNS 数据没多少,架子占了大头。

头一号浪费是 Rust 的 Vec 和 String。这俩为了支持「以后往里加东西」,都带着容量字段。可缓存记录写入之后从不修改,这个「以后」永远不会来,每条白占 64 字节。第二号是指针:answer、authority、additional 三张记录表各自为政,表间引用走 8 字节指针。第三号最冤:枚举里块头最大的变体把小变体也撑大了,一条 A/AAAA 记录光 padding 就浪费 120 多字节。

打个比方

这就像搬家打包,每个纸箱只装一半,留一半空着「以防以后再塞点什么」。可这些箱子封箱就直接进仓库,永远不再打开。一间房这么干无所谓,两千五百亿个箱子这么干,仓库就得多盖一片。

我对这种看不见的浪费有点条件反射。2024 年我给自己 SaaS 的登录页接过一个免费防刷脚本,发小阿坤抱怨说后台一开,他笔记本风扇就起飞。我开着任务管理器晾了一小时才看见:GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹。单看一下没什么,架不住它一直跳。字节的事一个样:单条 64 字节没人当回事,乘上量,机房的「风扇」就起飞了。

3五步瘦身

五步没有一步是高深算法,全是把数据的形状改成「写死不再动」

Cloudflare 的改法一步比一步彻底,最后一步干脆把结构体扔了。

步骤改什么省多少
① 换容器Vec/String 换成 Box<[T]>/Box<str>,砍掉容量字段64 字节/条
② 并表answer/authority/additional 三张表并成一张,8 字节指针换 2 字节 u16 偏移28 字节/条
③ 省域名记录 owner 域与查询域名相同时直接省略(Option<Box<Name>>)视记录而定
④ 枚举装箱大变体装箱,A/AAAA 不再替别人的块头买单120+ 字节 padding
⑤ 存原始字节记录数据直接存 DNS wire format:单块 Box<[u8]>,每条 2 字节长度前缀+原始字节结构体开销归零

合起来:单条 953 字节到 420 字节,降 56%;堆分配 1.1 KB 到 461 字节,降 58%。说白了思路就一条:这数据这辈子不改了,那就按「不改」的样子长。

同一条缓存记录:瘦了 56%,反而更快了优化前优化后单条内存953 B420 B−56%插入吞吐625K/s893K/s+43%查询延迟828 ns670 ns−19%常驻内存 p999.3 GB5.3 GB−43%× 2,500 亿条记录 ≈ 释放约 100 TB
来源:Cloudflare 工程博客(2026-08),关于 1.1.1.1 的 DNS 缓存。把单条缓存记录压缩 56% 之后,整条链路反而更快——全球机群共释放约 100 TB 内存。
4反而快

省内存反而更快:热路径是「读缓存、序列化回报文」,存原始字节等于提前把活干完了

最漂亮的不是第五步省了多少,是它顺手把最热那条路修直了。

旧布局

网络进来的本来就是 wire format,先解析成漂亮的结构体存着;查询命中时,再把结构体序列化回 wire format 发出去。拆一遍、拼一遍,两头的活全干了,图啥?

新布局

缓存里躺的就是 wire format 原始字节,命中时基本一次拷贝完事。当年解析那一遍,本来就是白干。

另一半功劳是缓存局部性:一条记录从东一块西一块的堆分配,变成挤在一起的连续字节,CPU 预取不扑空。数字摆在这儿:

单条足迹
−56%
插入吞吐
+43%
查询延迟
−19%
单机 p99 内存
−43%

口径:插入 62.5 万→89.3 万条/秒;延迟 828→670 纳秒;p99 常驻内存 9.3 GB→5.3 GB,均出自 Cloudflare 原文基准。

5杠与权衡

HN 吵的三根杠都在理,但代价这一栏 Cloudflare 也没藏着

128 条评论里,真正有营养的是三根杠。

第一根:「2,500 亿条还叫缓存吗?这规模更像一个数据库。」名字随你叫,工程约束是真的:数据库级的量,缓存级的延迟要求,两头都得伺候。第二根最有意思:有人点破,解析得更「丰富」的内存表示未必更快,热路径上要的是字节,你偏先加工成结构体,回头还得拆回去。好比饭馆把整条鱼片好了摆盘,客人要的却是整条打包。第三根扎心:「Vec 容量字段这种浪费,当初设计评审怎么没抓住?」我看没什么好嘲的,953 字节在评审桌上真不算事,它是在 2,500 亿这个乘数下才变成事的。数量级变了,对错得重算。

权衡也明摆着:wire format 放弃了随机索引,想找某条记录只能顺序遍历,好在单个应答里记录数少,代价可忽略;另外 jemalloc 按 size class 取整,40 字节的 MX 记录仍会被取整到 48 字节,零头省不干净。
6带走

你系统里也有这本账:先找数量最大的那类对象,再量它的形状

这套打法没有 Cloudflare 的规模也成立,需要的只是那道乘法。

照方抓药的话:找出你系统里数量最大的那类对象,缓存条目、消息、订单行都行,量一下单条实际占多少,然后问三个问题。它写入后还改不改?不改,容量字段和预留空间全是白占。它里头的指针指向的东西,能不能内联进来?它的枚举里最大的变体有多大,是不是让所有小变体陪着买单?也别抄作业抄过头:这五步成立的前提是「写入后从不修改」,你的数据要是天天在改,容量字段和预留空间就不叫浪费,叫本分。

核心

顺序别搞反:先算乘数,再抠字节。2,500 亿条面前,1 个字节是 250 GB;一千条面前,抠出花来也没几个钱。抠之前先确认你抠的东西够多。

吴军说简单是工程之美,这案子给这句话添了个注脚:五步里没有一步用到新算法,全是把数据的表示改得跟它的生命周期对上。至于省和快能不能兼得,答案取决于你省掉的那部分,是不是热路径上本来就要绕的弯路。

取材声明:本文思想框架取材自吴军《数学之美》(信息的表示与编码决定系统成本、数量级思维、简单是工程之美);事件与全部数字出自 Cloudflare 工程博客(2026-08-27)及 Hacker News 相关讨论,技术细节以 Cloudflare 原文为准。本文为技术科普解读。

テクノロジー

一条 DNS 缓存记录瘦身 56%,全球省出 100TB:把数据的形状改对了,省内存反而更快

2026年8月28日 · 吴军《数学之美》約 6 分

2,500 亿条缓存记录,每条多浪费 1 个字节,全球就得多烧 250 GB 内存。Cloudflare 在 2026-08-27 的工程博客里算的就是这笔账:他们把 1.1.1.1 公共解析器背后那套 DNS 缓存的单条记录,从 953 字节压到 420 字节,全球机群省出约 100 TB。你以为这是纯抠门?插入吞吐还涨了 43%。省着省着,反而快了。

30 秒读懂
1数量级

在 2,500 亿条记录面前,1 个字节就是 250 GB,这道乘法比任何算法都硬

这事的起点就一道小学乘法。

1.1.1.1 是 Cloudflare 的公共 DNS 解析器,背后那套缓存系统内部代号叫 Big Pineapple,全球同时保有超过 2,500 亿条缓存记录。这个量级下,单条记录浪费 1 个字节,全球就多耗 250 GB 以上。你别看 953 字节一条不起眼,搁家用电脑上连个响都听不见;乘上 2,500 亿,它就是按机柜算的真金白银。这也是这类系统抠字节的正当性所在:别处的优化论毫秒,这里的优化直接论吨。

⚡

为什么值得看:这篇博客在 Hacker News 上拿了约 455 分、128 条评论。热闹的点倒不在省钱本身:它证明了一件反直觉的事,把内存布局改对,省和快可以同时拿。

《数学之美》里吴军反复讲一个朴素的道理:信息的表示与编码,决定一个系统的成本;微小的量乘上巨大的倍数,就是宏观的量。DNS 缓存恰好是这句话的极端案例。

2找浪费

浪费不在业务逻辑里,藏在容量字段、8 字节指针和 padding 的缝里

拆开一条 953 字节的记录,真正的 DNS 数据没多少,架子占了大头。

头一号浪费是 Rust 的 Vec 和 String。这俩为了支持「以后往里加东西」,都带着容量字段。可缓存记录写入之后从不修改,这个「以后」永远不会来,每条白占 64 字节。第二号是指针:answer、authority、additional 三张记录表各自为政,表间引用走 8 字节指针。第三号最冤:枚举里块头最大的变体把小变体也撑大了,一条 A/AAAA 记录光 padding 就浪费 120 多字节。

打个比方

这就像搬家打包,每个纸箱只装一半,留一半空着「以防以后再塞点什么」。可这些箱子封箱就直接进仓库,永远不再打开。一间房这么干无所谓,两千五百亿个箱子这么干,仓库就得多盖一片。

我对这种看不见的浪费有点条件反射。2024 年我给自己 SaaS 的登录页接过一个免费防刷脚本,发小阿坤抱怨说后台一开,他笔记本风扇就起飞。我开着任务管理器晾了一小时才看见:GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹。单看一下没什么,架不住它一直跳。字节的事一个样:单条 64 字节没人当回事,乘上量,机房的「风扇」就起飞了。

3五步瘦身

五步没有一步是高深算法,全是把数据的形状改成「写死不再动」

Cloudflare 的改法一步比一步彻底,最后一步干脆把结构体扔了。

步骤改什么省多少
① 换容器Vec/String 换成 Box<[T]>/Box<str>,砍掉容量字段64 字节/条
② 并表answer/authority/additional 三张表并成一张,8 字节指针换 2 字节 u16 偏移28 字节/条
③ 省域名记录 owner 域与查询域名相同时直接省略(Option<Box<Name>>)视记录而定
④ 枚举装箱大变体装箱,A/AAAA 不再替别人的块头买单120+ 字节 padding
⑤ 存原始字节记录数据直接存 DNS wire format:单块 Box<[u8]>,每条 2 字节长度前缀+原始字节结构体开销归零

合起来:单条 953 字节到 420 字节,降 56%;堆分配 1.1 KB 到 461 字节,降 58%。说白了思路就一条:这数据这辈子不改了,那就按「不改」的样子长。

同じキャッシュエントリ:56%軽くなり、しかも速くなった改善前改善後メモリ/件953 B420 B−56%挿入速度625K/s893K/s+43%参照遅延828 ns670 ns−19%RAM p999.3 GB5.3 GB−43%× 2,500億件 ≈ 約100 TB解放
出典:Cloudflare エンジニアリングブログ(2026-08)、1.1.1.1 の DNS キャッシュについて。1件あたりのエントリを 56% 軽量化した結果、処理はむしろ速くなり、全体で約 100 TB のメモリを解放した。数値は公式ブログに準じる。
4反而快

省内存反而更快:热路径是「读缓存、序列化回报文」,存原始字节等于提前把活干完了

最漂亮的不是第五步省了多少,是它顺手把最热那条路修直了。

旧布局

网络进来的本来就是 wire format,先解析成漂亮的结构体存着;查询命中时,再把结构体序列化回 wire format 发出去。拆一遍、拼一遍,两头的活全干了,图啥?

新布局

缓存里躺的就是 wire format 原始字节,命中时基本一次拷贝完事。当年解析那一遍,本来就是白干。

另一半功劳是缓存局部性:一条记录从东一块西一块的堆分配,变成挤在一起的连续字节,CPU 预取不扑空。数字摆在这儿:

单条足迹
−56%
插入吞吐
+43%
查询延迟
−19%
单机 p99 内存
−43%

口径:插入 62.5 万→89.3 万条/秒;延迟 828→670 纳秒;p99 常驻内存 9.3 GB→5.3 GB,均出自 Cloudflare 原文基准。

5杠与权衡

HN 吵的三根杠都在理,但代价这一栏 Cloudflare 也没藏着

128 条评论里,真正有营养的是三根杠。

第一根:「2,500 亿条还叫缓存吗?这规模更像一个数据库。」名字随你叫,工程约束是真的:数据库级的量,缓存级的延迟要求,两头都得伺候。第二根最有意思:有人点破,解析得更「丰富」的内存表示未必更快,热路径上要的是字节,你偏先加工成结构体,回头还得拆回去。好比饭馆把整条鱼片好了摆盘,客人要的却是整条打包。第三根扎心:「Vec 容量字段这种浪费,当初设计评审怎么没抓住?」我看没什么好嘲的,953 字节在评审桌上真不算事,它是在 2,500 亿这个乘数下才变成事的。数量级变了,对错得重算。

权衡也明摆着:wire format 放弃了随机索引,想找某条记录只能顺序遍历,好在单个应答里记录数少,代价可忽略;另外 jemalloc 按 size class 取整,40 字节的 MX 记录仍会被取整到 48 字节,零头省不干净。
6带走

你系统里也有这本账:先找数量最大的那类对象,再量它的形状

这套打法没有 Cloudflare 的规模也成立,需要的只是那道乘法。

照方抓药的话:找出你系统里数量最大的那类对象,缓存条目、消息、订单行都行,量一下单条实际占多少,然后问三个问题。它写入后还改不改?不改,容量字段和预留空间全是白占。它里头的指针指向的东西,能不能内联进来?它的枚举里最大的变体有多大,是不是让所有小变体陪着买单?也别抄作业抄过头:这五步成立的前提是「写入后从不修改」,你的数据要是天天在改,容量字段和预留空间就不叫浪费,叫本分。

核心

顺序别搞反:先算乘数,再抠字节。2,500 亿条面前,1 个字节是 250 GB;一千条面前,抠出花来也没几个钱。抠之前先确认你抠的东西够多。

吴军说简单是工程之美,这案子给这句话添了个注脚:五步里没有一步用到新算法,全是把数据的表示改得跟它的生命周期对上。至于省和快能不能兼得,答案取决于你省掉的那部分,是不是热路径上本来就要绕的弯路。

取材声明:本文思想框架取材自吴军《数学之美》(信息的表示与编码决定系统成本、数量级思维、简单是工程之美);事件与全部数字出自 Cloudflare 工程博客(2026-08-27)及 Hacker News 相关讨论,技术细节以 Cloudflare 原文为准。本文为技术科普解读。