Go 为什么调高 GOGC 会换来 OOM:GOMEMLIMIT 不是替你付账的人
GOGC 调高后 GC 变少了、CPU 好看了,但堆峰值也高了。GOMEMLIMIT 不是另一个版本的 GOGC,它约束的是 Go runtime 管理的内存边界,不是整个 RSS。
GOGC 调高后 GC 变少了、CPU 好看了,但堆峰值也高了。GOMEMLIMIT 不是另一个版本的 GOGC,它约束的是 Go runtime 管理的内存边界,不是整个 RSS。
pprof 只告诉你在哪,不告诉你为什么。按创建路径、取消路径、响应路径三条线,把每个阻塞 goroutine 的生命周期拆清楚——是谁创建的、谁来取消、有没有响应 Done。
goroutine 涨了,别直接怀疑 context 泄漏。先用 NumGoroutine 确认趋势,再用 pprof 把数量变成栈,最后用 go vet 抓住静态路径上的低级错误——这个顺序不能反。
Context 能被取消,却没有自己的 Cancel 方法——这是故意的。WithCancel 返回两个东西:观察用的 Context 和控制用的 CancelFunc。子操作不能取消父操作,调用链才不会乱。
Go 的 context 看起来啰嗦,尤其是 handler、service、repo 层层传 ctx。真正的取舍不是语法优雅,而是把调用链生命周期放到签名里,让超时、取消和资源边界变得可查。
订阅费不是一笔大钱,但它最会悄悄流血。Paperless-ngx、Karakeep、Vaultwarden、Anytype、AdGuard Home 这 5 个开源项目,适合把文档、书签、密码、知识库和全屋去广告慢慢迁回自己手里。
很多人盯着 STW 的微秒级停顿不放,却忽略了并发标记才是 GC 真正吃掉 CPU 的地方。三色标记解决的不是颜色问题,是并发安全;写屏障也不是玄学,是防止漏标的保险。
2026-05-27 前后,openai-codex / gpt-5.5 用户集中遇到 `TypeError: 'NoneType' object is not iterable`、fallback 和卡死。问题大概率不在你的配置,而在 Codex backend 与 openai-python Responses stream 解析之间的兼容坑。
select 不是一次随机的 O(1) 选择。每个 select 背后,runtime 要剔除 nil channel、随机化 poll order、按地址排序 lock order、逐个检查、注册、等待、清理。case 越多,runtime 的活越重。
close(ch) 不只是关门。源码里它会遍历 recvq 和 sendq,按队列逐个唤醒所有阻塞的 goroutine。区别是:receiver 得到零值,sender 等到的是 panic。