Go 中 context.WithCancel 忘记调用 cancel 导致 goroutine 泄漏的排查与修复
线上服务跑了几天后内存缓慢上涨,pprof 显示 goroutine 数量从启动时的几十个涨到了几万个,而且 GC 之后也不下降。排查后发现是几个后台任务在创建 context.WithCancel 之后,只在错误路径调用了 cancel,正常返回时没有调用,导致 context 内部的 goroutine 和子 context 一直被父 context 引用着无法释放。这个问题在 Go 里非常常见,因为 context 的取消函数本身是幂等的,但很多人误以为只有超时或者出错时才需要调用,忽略了正常结束时也...