我们如何通过优化1.1.1.1的DNS缓存节省100 TB的内存

对Big Pineapple DNS缓存布局的五个Rust级内存优化将每条目内存减少了56% ,从而在Cloudflare的车队中释放了大约100 TB的内存。

对Big Pineapple DNS缓存布局的五个Rust级内存优化将每条目内存减少了56%,从而在Cloudflare的车队中释放了大约100 TB的内存。Big Pineapple是1.1.1.1、网关DNS、DNS防火墙、AS112和其他几项Cloudflare DNS服务背后的平台,随时存储超过2500亿个DNS缓存条目。

按照这样的规模,每个条目浪费一个字节的成本超过250千兆字节的内存。连续五次更改缓存条目在内存中的存储方式,将每个条目的占用空间减少了50%以上。在我们的机队中,这些更改释放了大约100 TB的内存,相当于我们第13代服务器中130台服务器的内存量。缓存也变得更快了。

插入吞吐量增加了43%,查找延迟下降了19%,因为更少的分配和更好的内存局部性意味着我们没有以速度换取空间。我们的缓存在冷启动时, Big Pineapple以空缓存开始。当DNS查询到达时,缓存会填满,直到达到最大条目数,此时我们会驱逐较旧或不太受欢迎的项目以腾出空间。确切的缓存大小因数据中心而异。

当使用EDNS客户端子网( ECS )时,权威服务器根据客户端的网络返回不同的答案,因此我们缓存同一查询的多个版本。这增加了条目的数量和每个条目消耗的内存,使得本文中的优化对ECS密集型位置特别有影响。缓存中的每个项都是键值对。

键标识查询的内容:该值存储DNS响应本身:答案、权限和其他记录部分,以及创建时间、命中计数器和生存时间(TTL)等元数据。这两种结构都有改进的余地。几个字段使用的类型承载了条目存储后不需要的开销。