💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

在超多核时代,Go语言的并发模型受到NUMA架构和GC的性能瓶颈影响,尽管核心数增加,程序吞吐量未线性增长。Go团队计划通过优化调度和内存分配来提升性能。

🎯

关键要点

  • 在超多核时代,Go语言的并发模型受到NUMA架构和GC性能瓶颈影响。
  • 尽管核心数增加,程序吞吐量未线性增长,甚至P99延迟变高。
  • Go的GMP调度模型在小几十核机器上表现良好,但在128核机器上亲和性被撕裂。
  • GC导致的STW(Stop The World)使得调度器在恢复后分配P给任意空闲的M,造成Cache Miss。
  • NUMA架构下,CPU访问本地内存快,跨大区访问延迟高,Go语言目前是非NUMA感知的。
  • Go的工作窃取算法在NUMA时代变得低效,导致内存访问延迟增加。
  • Go团队计划通过优化调度和内存分配来提升性能,解决超高核数和NUMA下的性能瓶颈。
  • Go 1.25和1.26已带来部分改进,NUMA感知的内存分配等优化在后续版本中规划。
  • 开发者需理解代码在真实硬件和操作系统上的物理足迹,避免盲目增加机器。
  • 在高并发服务性能退化时,检查NUMA命中率,考虑使用runtime.LockOSThread()等方法。
➡️

继续阅读