精华简报:Cloudflare通过DNS缓存优化节省100TB内存

核心成就

  • 内存节省:通过5项关键优化,将单条DNS缓存记录的内存占用降低50%以上,全系统累计节省100TB内存(相当于130台Gen 13服务器的内存总量)。
  • 性能提升:优化后缓存插入吞吐量提升43%,查找延迟降低19%,实现“空间与速度双赢”。

优化背景

  • 规模挑战:Cloudflare的DNS平台”Big Pineapple”需处理2500亿条DNS缓存记录,每条记录浪费1字节即导致全系统损失250GB内存。
  • ECS影响:支持EDNS Client Subnet(ECS)时,需为同一查询缓存多个版本,进一步放大内存消耗。

关键技术优化

  1. 消除冗余容量字段

    • 问题:Rust的Vec<T>和String类型默认保留”容量”字段(8字节/字段),即使数据不可变。
    • 方案:改用不可变类型Box<[T]>和Box<str>,移除容量字段及堆预留空间。
    • 效果:单条记录节省64字节,全系统节省15TB+内存。
  2. 合并记录存储结构

    • 问题:DNS响应中answer、authority、additional分区独立存储,产生额外指针开销。
    • 方案:将三区合并为单一连续内存块,通过偏移量定位。
    • 效果:减少2个指针(16字节/记录),节省4TB+内存。
  3. 压缩时间戳与计数器

    • 问题:UnixTimeStamp(8字节)和u32计数器存在高位未使用空间。
    • 方案:改用更紧凑的u48时间戳和u24计数器。
    • 效果:单条记录节省6字节,全系统节省1.5TB内存。
  4. 内存对齐优化

    • 问题:结构体字段因内存对齐规则产生填充字节。
    • 方案:重排字段顺序,最小化填充空间。
    • 效果:单条记录节省8字节,全系统节省2TB内存。
  5. 自定义分配器调优

    • 问题:频繁小内存分配导致碎片化。
    • 方案:预分配大内存池,统一管理小对象。
    • 效果:提升内存局部性,降低分配开销。

方法论亮点

  • 精准基准测试:
    模拟真实流量分布(56% A记录、25% AAAA、19% TXT),使用自定义内存分配器跟踪每次优化效果。
  • 生产验证:
    在部署过程中监控常驻内存变化,确保优化效果与实际场景一致。

行业启示

  1. 极致优化思维:在超大规模系统中,单字节优化可产生TB级收益。
  2. 性能与效率平衡:通过数据结构重构(如Vec→Box<[T]>)实现内存与速度双提升。
  3. Rust语言优势:利用Rust的内存安全特性,在底层优化时避免引入风险。

原文链接:Saving 100TB of Memory at Cloudflare
适用场景:DNS服务、大规模缓存系统、内存敏感型基础设施。