标签 垃圾回收 下的文章

老板花重金买了台 128 核服务器,我的 Go 程序反而变慢了?

本文永久链接 – https://tonybai.com/2026/03/12/go-concurrency-scalability-issues-on-128-core-cpu

大家好,我是Tony Bai。

设想一个极其真实的职场场景:

你负责的 Go 核心微服务最近流量暴涨,CPU 频频告警。为了解决这个问题,老板大笔一挥,批了几十万预算,采购了最新一代的 128 核 256 线程的怪兽级服务器(比如 AMD EPYC 或 Intel 至强)。

你满心欢喜地把程序部署上去,期待着 QPS 翻倍、延迟减半的奇迹。

结果盯着监控面板,你傻眼了:核心数翻了 4 倍,但程序的吞吐量根本没有线性增长,甚至 P99 延迟还比以前在 32 核机器上时变高了!

老板拍着你的肩膀问:“这服务器是不是买亏了?”你满头大汗,不知道问题出在哪。

别慌,这可能真不是你代码写得烂。在 2026 年的今天,随着芯片制程逐渐逼近物理极限(2nm),单核性能基本停滞,硬件厂商只能疯狂“堆核心”。这就导致了一个在过去只有超算中心才会关心的底层概念,如同幽灵般降临到了每一个普通开发者头上——NUMA(非一致性内存访问)架构

今天,我们就来拆解一下:为什么 Go 语言引以为傲的并发模型,在超多核时代开始“水土不服”?而 Go 核心团队,又打算在今年如何打赢这场史诗级的性能翻身仗?

Go 调度器的“间歇性失忆症”

在小几十核(比如 32 核及以内)的普通机器上,Go 的 GMP 调度模型(Goroutine – Processor – Machine)堪称完美。调度器会尽量让一个 Goroutine (G) 在同一个 Processor (P) 和同一个系统线程 (M) 上运行,以保证 CPU 缓存(L1/L2 Cache)的高命中率。

但在 128 核/256线程(Go眼中 NumCPU()返回 256)的庞然大物上,这种亲和性(Affinity)被极其残酷地撕裂了。

一个值得怀疑的原因是 GC(垃圾回收)带来的 STW(Stop The World)。

每次 GC 开始和结束时,世界都会短暂停止,所有的 P 都会被冻结。当几毫秒后世界重新启动时,Go 的调度器会得一种“失忆症”:它会把“复活”的 P 分配给任意空闲的 M。

这就好比你原本在工位 A 办公,桌上摆满了你需要的资料(CPU Cache 中的热数据)。突然老板喊停,重新洗牌,把你随机分配到了工位 B。你需要重新跨过大半个办公室去搬资料(导致极其严重的 Cache Miss)。

此外,GC 标记工作在 STW 期间启动,并以高优先级调度,这使得它们很可能在之前运行 G 的 P 上运行,即使有空闲的 P。这会迫使 G 迁移到另一个 P 上。

如果你打开 Go 的 Execution Trace,你会看到一幅灾难般的景象:短短 10 毫秒内,你的 Goroutine 就像弹珠一样,在 128 个 CPU 核心之间来回横跳(下面是一个开发者在真实环境采集到的数据, G11到G19在多个P上切换)。微秒级的跳跃积累起来,就成了吞噬性能的黑洞。

NUMA 架构下的双倍“跨省流量”惩罚

如果说缓存失效是“切肤之痛”,那么NUMA 架构带来的内存惩罚,就是真正的“断骨之痛”。

在 128 核这种级别的 CPU 里,物理内存是被划分成多个“大区(NUMA Node,简称Node,每个Node通常有16到64个CPU核)”的。

  • CPU 访问自己大区的内存,极快。
  • CPU 跨大区去访问别人的内存(Remote Node),延迟会瞬间飙升 2 倍甚至更多

但问题是,目前的 Go 语言是“非 NUMA 感知”的!

当你的代码执行 new(struct) 申请内存时,Go 的全局自由列表(Global Free List)完全可能把一块物理位置位于 Node 1 的内存,分配给正在 Node 0 上运行的 CPU。结果就是,你之后的每一次内存读写,都在交高昂的“跨省长途费”。

更要命的是 Go 引以为傲的“工作窃取(Work-Stealing)”算法

当某个 CPU 核心闲下来时,它会去偷别的核心队列里的 Goroutine 来执行。这在以前是神来之笔,但在 NUMA 时代却成了毒药:

它把任务偷了过来,但任务对应的数据还留在原来的 NUMA 节点上!这就好比你抢了别人的砖头搬,但你每次都得跨越一整个城市去拿砖。

面对 2 倍以上的内存访问物理延迟,你写再多牛逼的设计模式,也无济于事。

针对上述问题,Go 1.25 和 1.26 已带来部分改进(容器感知的 GOMAXPROCSGreen Tea GC),NUMA 感知的内存分配等更深层优化仍在 Go 1.27以及后续版本的规划中。

2026 年,Go 团队的破局之战

面对这台越来越难以驾驭的硬件巨兽,Go 核心团队当然没有坐以待毙。在 Go 的官方 issue(#65694, #78044)中,核心成员 Michael Pratt 已经明确表态:解决超高核数和 NUMA 下的性能瓶颈,是今年 Go 团队的头等任务之一。

我们即将看到 Go 团队打出的几记重拳:

  • 修复“失忆症”(强化亲和性锁链)

就在去年10月份,Go 团队合并了一个关键的底层补丁(CL 714801)。现在,STW 结束后,runtime 会拼命尝试将 P 重新分配给它在 STW 之前绑定的那个 M。把你牢牢按在原来的工位上,死死护住你的 CPU Cache。

  • 驯服 GC 抢占(减少驱逐)

新的调度逻辑将尽量避免 GC worker “鸠占鹊巢”,强行驱逐正在运行业务逻辑的 Goroutine,保证业务代码执行环境的连贯性。

  • 探索 NUMA 感知的内存分配(软性偏好)

这是目前最艰难但也最激动人心的探索。未来的 Go 有望实现:优先在本地 NUMA 节点分配内存;工作窃取时,优先偷取同一个 NUMA 节点内的任务。彻底斩断无意义的“跨省流量”。

小结:云原生开发者的自我修养

在摩尔定律彻底失效的今天,硬件发展的路线图已经极其明确:单核停滞,核心数将向 256 核、512 核无限狂飙。

这给我们所有 Go 开发者敲响了警钟:

在极致的性能调优面前,我们不能再仅仅满足于写出“业务正确”的代码,更要理解你的代码在真实硬件和操作系统上的物理足迹。

在 Go 1.27 或 Go 1.28 带来这些“性能怪兽级优化”落地之前,如果你发现你的高并发服务在顶级服务器上性能退化,请记住今天这篇文章:

  1. 不要急着改代码,先用 top 和 numastat 查一下你的 NUMA 命中率。
  2. 极端延迟敏感的场景下,可以临时考虑使用 runtime.LockOSThread() 或利用 cgroups 将进程绑定在特定的 NUMA 节点上运行。

打破对“加机器就能解决一切”的迷信,这是从初级码农走向资深架构师的必经之路。

参考资料

  • https://github.com/golang/go/issues/65694
  • https://github.com/golang/go/issues/78044

今日互动探讨:

你在生产环境中,遇到过哪些“加了机器/加了配置,性能反而变差”的诡异玄学事件?后来是怎么排查破解的?

欢迎在评论区分享你的血泪排查史!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

AI 时代的新王座:为什么说 Go 可能是开发 AI Agent 的最佳语言?

本文永久链接 – https://tonybai.com/2026/03/07/why-go-is-the-best-language-for-ai-agents

大家好,我是Tony Bai。

当我们在谈论 AI 编程时,Python 似乎是那个无需讨论的“默认选项”。

然而,随着 AI 应用从模型训练(Training)走向自主智能体(Agents)和复杂的工程落地,基础设施层的语言选型正在悄然发生变化。近日,开源数据编排工具 Bruin 的作者发表了一篇题为《Go 是开发 AI Agents 的最佳语言》的文章,在 Hacker News 上引发了数百条跨语言阵营的激烈辩论

为什么一位有着 10 年 Python 和 JS 经验的开发者,最终选择用 Go 来构建现代 AI 基础设施?在 AI 生成代码(AI-Generated Code)日益普及的今天,编程语言的“静态类型”、“编译速度”和“语法极简主义”又被赋予了怎样的新维度价值?

本文将深度拆解这场争论,带你探讨在“Vibe Coding(氛围编程)”时代,Go 语言如何凭借其独特的设计哲学,意外地命中 AI Agent 开发的甜点。

为什么是 Go?来自生产一线的工程反思

Bruin 是一个开源的 ETL(提取、转换、加载)工具。在数据工程领域,Python 拥有统治级的地位(Pandas, Airflow 等),按理说,Bruin 完全应该用 Python 编写。

但作者最终选择了 Go。原因在于,AI Agent 和数据编排工具在本质上属于基础设施(Infrastructure),它们面临的工程约束与模型训练截然不同:

  1. 极致的并发需求:Agent 绝大部分时间都在等待外部 API 的响应(OpenAI, Anthropic)。Go 极其轻量的 Goroutine 机制(2KB 栈空间,极低的上下文切换成本)允许在单机上轻松维持数万个并发请求,而 Python 的 GIL(全局解释器锁)即使配合 asyncio,在 500-1000 RPS 后也会遇到明显的线程竞争瓶颈。(注:最新版Python已经去除了GIL的限制。)
  2. 极简的部署体验:Go 编译出的单一静态二进制文件,无需像 Python 那样处理复杂的虚拟环境(venv)、依赖冲突和运行版本问题。对于需要在用户机器上运行的 CLI 工具来说,Go 是“分发即运行”的典范。
  3. 跨平台验证的便利:Go 一等公民的跨平台编译能力,意味着不仅开发者可以轻松构建多平台产物,未来的“后台 AI Agent”也能在一个隔离的沙箱中快速验证代码的跨平台兼容性。

除了上述硬核的工程指标外,作者还坦诚地分享了一个极其主观,但对初创团队至关重要的考量:开发体验(Developer Experience)与情绪价值。

作者将在很长一段时间内作为项目的核心贡献者,他深刻地意识到:

“对于一个小型团队来说,在构建大型项目时,快乐和活力(Joy and Energy)是最稀缺的资源之一。因此,至关重要的是,我不能对自己每天要面对的技术栈感到畏惧或厌烦。”

Go 语言或许在某些特性上不如 Python 灵活,也不如 Rust 表达力强,但它带来的那种“一切尽在掌握”的确定性和快速获得反馈的成就感,能让开发者在漫长的马拉松式开发中保持心流状态。这种心理层面的正向反馈,在 AI Agent 这种充满不确定性的前沿领域探索中,往往是支撑团队走过低谷、坚持到黎明的关键力量。

如果说以上只是 Go 作为“云原生王者”的常规操作,那么在引入大语言模型(LLM)作为“代码生成器”后,Go 的语言特性产生了奇妙的化学反应。

静态编译:给 AI 戴上“紧箍咒”

当 Coding Agent 开始每分钟吐出成千上万行代码时,最大的挑战不再是“如何生成”,而是“如何证明它有效”。

在解释型语言(如 Python 或 JavaScript)中,代码的正确性往往只有在运行到特定分支时才能被验证。作者指出,这是 Go 在对抗 AI 幻觉时最大的优势之一:Go 是一门强类型的编译型语言。

编译器的“守门员”效应

当你用 LLM 生成 Go 代码时,go build 成了一道天然且严苛的防火墙。类型不匹配、未使用的变量、错误的函数签名——这些占据了 AI 幻觉相当大比例的低级错误,会被 Go 编译器瞬间无情地驳回。

正如一位 HN 网友 所言:

“在这个人人都在‘氛围编程(vibing left and right)’的时代,你迫切需要一个编译器在背后支持你。Go 让你可以写稍微随意一点的代码,但又不会像 Python 或 JS 那样毫无底线。编译器扮演了看门人的角色,将混乱控制在一定范围内。”

为什么不是 Rust?

讲到编译期安全,Rust 绝对是无可争议的王者。但为什么作者认为 Go 比 Rust 更适合 AI Agent?

  • 迭代速度决定一切:AI Agent 的工作流是一个“生成 -> 编译 -> 报错 -> 修复”的紧密反馈循环(Feedback Loop)。Go 的编译速度几乎是瞬时的,这使得 LLM 的试错循环可以极快地运转。而 Rust 漫长的编译时间,在这里成为了致命的瓶颈。
  • 借用检查器的“认知负荷”:Rust 的内存模型(生命周期、借用)极其复杂。现阶段的 LLM 在处理复杂的借用关系时,常常会陷入“为了让编译器闭嘴而无脑 clone()”的陷阱,导致生成的代码偏离 Rust 的最佳实践。
  • 更平缓的试错成本:Go 的垃圾回收(GC)机制让 AI(以及审查代码的人类)可以专注于业务逻辑,而不必在内存管理上耗费计算 token 和审查精力。

简单来说:Rust 的上限极高,但门槛太陡;Go 用 20% 的努力(快速编译+GC),换取了 80% 媲美 Rust 的安全性,这恰好是 AI 迭代的最优解。

极简主义与“无聊”的胜利

Go 语言自诞生起,就因为其语法的“无聊”和“死板”(比如缺乏灵活的宏、长期没有泛型、繁琐的错误处理)而饱受争议。然而,在 AI 时代,这种“无聊”却意外地成为了巨大的优势。

“只有一种做法”的红利

Python 和 JavaScript 以“灵活”著称。在一个 JS 项目中,有人用 CommonJS,有人用 ES6 Modules;有人用 npm,有人用 pnpm。对于人类来说,这叫“生态繁荣”;但对于 LLM 来说,这叫“状态空间爆炸”(High Entropy)。

Go 是极其“固执”的语言(Opinionated)。

  • 格式化代码?只有 gofmt。
  • 怎么处理错误?永远是 if err != nil。
  • 怎么写测试?标准库 testing 包。

正如作者指出的:“要求 Agent 格式化 JS 代码,它会去引入一个新工具并尝试配置它;而在 Go 中,它只需要运行 gofmt。”

这种高度统一的代码风格,意味着在 LLM 的训练语料库中,Go 代码的“信噪比”极高。模型不需要在多种编程范式中猜测你的偏好,它输出的 Go 代码通常具有高度的同质性和可预测性。

人类可读性:代码审查的最后防线

当 AI 成为主要的“代码编写者”时,人类的角色将不可避免地向“代码审查者(Code Reviewer)”倾斜。

如果 AI 生成了一段高度抽象的 Haskell 代码,或者使用了大量宏的 Rust 代码,人类审查者需要耗费极大的脑力去反编译这些逻辑。

而 Go 代码是出了名的“所见即所得”。没有隐藏的控制流,没有复杂的运算符重载。当 AI 生成了几百行 Go 代码时,即使是一位初级开发者,也能相对轻松地顺着逻辑线读懂它在干什么。

在 AI 编程的下半场,“代码易读”将比“代码易写”重要一万倍。

跨越阵营的交锋:Hacker News 的不同声音

当然,这篇文章在 Hacker News 上并非一边倒的赞同。不同语言阵营的开发者提出了极其犀利的反思。

反思一:Python 真的过时了吗?

Python 拥护者指出,文章混淆了“运行时性能”和“开发生态”。

虽然 Go 在高并发和 I/O 上碾压 Python,但如果 AI Agent 的核心逻辑涉及大量的数据科学计算、复杂的概率模型,或者需要直接调用底层的 C++ 机器学习库,Python 依然是不可替代的粘合剂。对于许多初创团队来说,“让代码先跑起来”远比“让代码跑得快”更重要。

反思二:类型系统能否取代测试?

支持函数式语言(如 OCaml, F#)的开发者指出,Go 的类型系统依然过于薄弱。

Go 缺乏代数数据类型(ADT)和模式匹配,导致其虽然能抓住低级语法错误,但难以像 Rust 或 OCaml 那样“在编译期保证业务逻辑状态的正确性”。

对于他们而言,如果 AI 真的足够聪明,应该让 AI 生成具有极强类型约束的代码,把正确性完全交给编译器,而不是像 Go 那样依然需要编写大量的单元测试。

反思三:长远来看,语言还重要吗?

这是一个终极的哲学问题:如果未来 AI 不再犯错,能够零成本生成正确的机器码,高级编程语言还有存在的意义吗?

有评论认为,当模型能力足够强时,我们甚至不需要编译型语言的保护,直接用自然语言(英语)+ LLM 生成运行时的 WebAssembly 可能才是终局。在这个维度上,争论 Go 还是 Python,就像在争论用什么牌子的算盘(意指已经被时代所抛弃的东西)一样没有意义。

小结:实用主义者的狂欢

在 AI 技术日新月异的当下,我们往往容易陷入一种对“前沿”的盲目崇拜,认为只有最复杂的语言、最先进的模型才能构建出优秀的系统。

但 Bruin 作者的实践和 Go 社区的繁荣告诉我们另一个故事:工程的本质是权衡(Trade-off)。

Go 并不是世界上最完美的语言,它的类型系统不如 Rust 严谨,它的生态不如 Python 庞大。但它用极致的编译速度、简单的并发模型、出色的内存管理和统一的编码规范,构建了一个容错率极高的工程基座。并且在这个基座上,无论是人类还是 AI Agent,都能以最低的“认知摩擦力”输出可靠的工业级代码。

资料链接:

  • https://getbruin.com/blog/go-is-the-best-language-for-agents/
  • https://news.ycombinator.com/item?id=47222270

你更相信谁?

在 AI 编程的下半场,语言的地位正在重构。你是坚守 Python 的生态优势,还是更看好 Go 在“基础设施级 Agent”中的爆发?你认同“编译器是 AI 的最佳守门员”这个观点吗?

欢迎在评论区留下你的“阵营宣言”!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats