Go 1.24 的瑞士表如何为我们节省了数百千兆字节 | Datadog

主要观点:升级到 Go 1.24 引入运行时回归致内存使用增加,后发现高流量环境中内存使用不仅恢复还显著下降,探究 Go 1.24 中 Swiss Tables 实现如何减少内存使用及相关优化措施,包括对shardRoutingCache地图的分析等,还探讨了不同流量环境下的差异及进一步降低内存使用的方法,以及此优化对成本降低的影响和 Go 1.24 在生产中的经验教训。
关键信息

  • Go 1.23 基于桶的地图实现及相关结构(如桶结构、负载因子等)及内存使用估计。
  • Go 1.24 基于 Swiss Tables 和可扩展哈希的新地图实现,包括插入条目、处理满组、组负载因子和地图增长等机制及内存使用估计。
  • 不同流量环境下地图内存使用的差异及原因。
  • shardRoutingCache地图的结构优化及内存节省效果。
  • 优化对成本降低的两种途径(降低 Kubernetes 内存限制或用GOMEMLIMIT换 CPU)及在部分工作负载中的效果。
  • Go 1.24 在生产中的经验教训,如与 Go 社区合作、重视运行时指标和数据结构优化等。
    重要细节
  • shardRoutingCache地图的结构及各字段大小,如键为 16 字节,值中shardID4 字节、shardType8 字节、routingKey16 字节、lastModified8 字节等。
  • Go 1.23 中地图增长时旧桶的处理及内存使用情况,Go 1.24 中瑞士表的控制字、组结构及相关操作等。
  • 不同流量环境下元素数量及对应的内存使用计算,如低流量环境中 Go 1.23 和 Go 1.24 的对比。
  • Response结构的优化,将ShardTypeint改为uint8及引入新类型cachedResponse以减少内存使用。
  • 优化在不同服务中的成本降低效果展示,如数据处理服务的内存减少和部分服务的 CPU 使用率降低。
阅读 45
0 条评论