Golang goroutine泄漏怎么排查_Golang协程泄漏排查教程【实战】
协程泄漏需排除初始化波动和后台干扰,通过 runtime.NumGoroutine() 快速初筛,重点监控请求后不回落、压测后不恢复、长期单调上升三种情形;配合三处日志、pprof debug=2 查阻塞栈,关注 chan receive/select/semacquire/IO wait 状态;测试阶段用 goleak.VerifyNone 拦截泄漏;内存上涨未必反映在 heap profile,因 goroutine 会钉住大对象,须结合 goroutine 栈分析生命周期。协程数持续上涨且不回落,基本就是泄漏了——但得先排除初始化波动和系统 background goroutine 干扰,否则容易误判。用 runtime.NumGoroutine() 快速确认是否真泄漏这不是最终证据,但能帮你 5 秒内排除“假警报”。刚启动 HTTP 服务时看到 NumGoroutine() 突然跳到 120+,大概率只是 pprof、log、health check 等后台 goroutine 在初始化,不是泄漏。真正要盯的是这三种情况:单次请求处理完后,数字没回落(比如入口打点是 80,handler 返回后还是 80+)压测结束后等待 30 秒,总数仍比空闲态高一大截稳定运行几小时后,数字呈单调上升趋势(50 → 180 → 420)建议在关键路径加三处日志:log.Printf("goroutines@idle: %d", runtime.NumGoroutine())(空闲)、@start(请求进)、@done(返回前),别只采一次样。立即学习“go语言免费学习笔记(深入)”;用 /debug/pprof/goroutine?debug=2 抓阻塞源头默认的 ?debug=1 只给统计摘要,看不出谁卡在哪;必须加 ?debug=2 才输出完整调用栈。生产环境直接 curl 就行:curl "http://localhost:6060/debug/pprof/goroutine?debug=2"重点关注这些状态的 goroutine: Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
