我们如何通过优化1.1.1.1的DNS缓存节省了100TB内存
内容提要
Cloudflare通过五项优化,将1.1.1.1 DNS缓存每条目内存占用从953字节降至420字节,节省约100TB内存。优化包括用Box替代Vec、合并列表、省略重复所有者、装箱枚举及存储原始数据,同时提升插入吞吐量43%和降低查找延迟19%。
延伸解读
内存优化的核心思路
文章通过五项优化将每条DNS缓存条目的内存占用从953字节降至420字节,节省约100TB内存。核心思路是消除不必要的字段和分配,例如用Box<[T]>替代Vec<T>以减少容量字段和堆内存浪费,以及将多个列表合并为带偏移的单一列表。这些改动不仅节省空间,还通过减少分配和改善内存局部性提升了性能。
性能与内存的权衡
优化过程中并非所有改动都直接降低内存,例如将大枚举变体装箱会增加堆分配和指针追踪,但通过权衡,对A/AAAA等常见记录类型节省了大量内存。最终,插入吞吐量提升43%,查找延迟降低19%,表明内存优化并未牺牲速度,反而因减少分配和改善缓存局部性而提升了性能。
生产环境中的实际效果
在生产环境中,p99内存从9.3GB降至5.3GB,降幅达43%,p90内存从6.5GB降至3.8GB,降幅42%。这些数字低于基准测试的56%降幅,因为实际内存还包括其他进程数据。优化后,整个集群的工作集内存减少了约100TB,计划将释放的内存用于增加缓存容量,以提高命中率并减少上游查询。
Q&A
Cloudflare如何通过优化1.1.1.1的DNS缓存节省了100TB内存?
Cloudflare通过五项优化将每个缓存条目的内存占用从953字节降至420字节,节省了约100TB内存。这些优化包括:用Box替代Vec、合并列表、省略重复所有者、装箱枚举以及存储原始数据。
Cloudflare的DNS缓存优化具体采用了哪些技术手段?
具体技术手段包括:1. 使用Box<[T]>和Box<str>替代Vec和String,去除容量字段和多余堆空间;2. 将答案、权威和附加部分合并为单个列表,用u16偏移量替代指针和长度;3. 对于与查询域名相同的记录所有者,省略所有者字段;4. 将大型枚举变体装箱,减少枚举大小;5. 将记录数据存储为原始字节,避免解析和序列化开销。
为什么Cloudflare的DNS缓存优化能提升性能?
优化减少了内存分配次数和改善了内存局部性,从而提升了性能。具体来说,插入吞吐量提升了43%,查找延迟降低了19%。
Cloudflare的DNS缓存优化对ECS(EDNS Client Subnet)场景有何影响?
ECS场景下,同一查询可能缓存多个版本,条目数和内存占用都更高,因此这些优化对ECS密集的数据中心尤其有益,能显著减少内存使用。
Cloudflare的DNS缓存优化中,为什么使用Box<[T]>替代Vec<T>?
因为缓存条目存储后不再修改,Vec的容量字段和预留空间是浪费的。Box<[T]>不可增长,不需要容量字段,也避免了预留堆空间,从而节省内存。
Cloudflare的DNS缓存优化中,如何存储记录数据以减少内存?
将记录数据存储为原始字节,使用单个Box<[u8]>,每条记录以2字节长度前缀加原始字节编码。这消除了枚举变体的开销和多次堆分配,并改善了CPU缓存局部性。
Cloudflare的DNS缓存优化后,内存和性能的具体数据变化是什么?
每个条目的净内存占用从953字节降至420字节(减少56%),每次分配从1.1KB降至461字节(减少58%)。插入吞吐量从625,000条目/秒提升至893,000条目/秒(增加43%),查找延迟从828纳秒降至670纳秒(降低19%)。