Cloudflare近日大幅降低了旗下1.1.1.1公共DNS解析器所使用的缓存内存,整个网络因此释放出约100TB内存。此次优化并未涉及更换服务器硬件或拆除内存模块,而是通过改进缓存DNS数据的软件存储方式实现。

这项工作主要围绕Big Pineapple展开。Big Pineapple是Cloudflare用于支撑1.1.1.1解析器、DNS防火墙以及其他多项DNS服务的缓存平台。Cloudflare系统工程师Sebastiaan Neuteboom在一篇技术博客中介绍了对Rust代码库进行的五项调整,使单条典型DNS缓存记录的占用空间从953字节降至420字节。
优化后的系统运行速度也有所提升。Cloudflare表示,缓存插入吞吐量从每秒625000条提高到893000条,查询延迟则从828纳秒降至670纳秒。在5月中旬至7月初的部署过程中,每个实例的第99百分位内存使用量从9.3GB降至5.3GB。
Cloudflare称,Big Pineapple始终缓存超过2500亿条DNS记录。在如此庞大的规模下,即使每条记录只浪费极少内存,累积起来也相当可观。公司估算,缓存条目中每多占用一个不必要的字节,整个服务器集群就会额外消耗超过250GB内存。
其中一项重要改动涉及Rust中的Vec和String类型。这些容器被设计为能够动态扩容,因此除了实际数据之外,还会保存容量等额外信息。但DNS记录进入缓存后并不需要继续扩展。Cloudflare于是用固定大小的盒装切片替代了这些结构,删除不再有用的元数据。据公司介绍,仅这一项调整就节省了超过15TB内存。
工程师还重新设计了DNS响应在内存中的排列方式。此前,Big Pineapple会为每个响应分别保存三组记录列表;新设计则将所有记录放进同一个缓冲区,再通过两个字节的偏移量标识各条记录的位置。
当所有者名称只是重复被查询的域名时,缓存现在也不再保留这些名称,而是在返回响应时重新构建。此外,系统还改为使用带长度前缀的原始DNS线路格式字节来保存记录数据,从而解决早期设计中的空间浪费问题。此前,一条仅占4字节的IPv4 A记录,与Cloudflare缓存的最大DNS记录类型——相对少见的NAPTR记录一样,都会占用144字节。改用可变长度的原始数据格式后,较短记录无需再为最长记录预留同样的空间。
Cloudflare在整个服务器集群中收回的100TB内存,大致相当于130台第13代服务器的内存容量。这些服务器每台搭载768GB DDR5-6400内存。Cloudflare曾考虑为该代服务器采用1152GB内存配置,但在评估高容量内存的成本后最终放弃。
有了这部分内存空间,Cloudflare计划扩大DNS缓存规模。将更多记录保存在本地,有望提高缓存命中率,并减少向权威DNS服务器发起的请求流量。
这并不是Cloudflare首次开展大规模内存效率优化。去年,公司还曾将负责处理请求的FL2层重写为Rust代码。在服务器内存价格不断上涨的情况下,通过软件优化释放现有基础设施的潜力,可能比单纯增加硬件更具成本效益。