登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go教程

Go goroutine 泄漏排查:用 pprof 找到没有退出的人

来源:Golang学习网专题原创

时间:2026-06-09 05:06:00 339浏览 收藏

goroutine 泄漏通常不是突然发生,而是每次请求、每个任务或每次重试多留下一点。等到数量明显升高时,服务已经开始延迟抖动。pprof 是定位泄漏最直接的工具。

先看数量趋势

runtime.NumGoroutine 或 Prometheus 指标能告诉你是否持续增长。短暂高峰后能回落通常不是泄漏,持续阶梯式上涨才危险。

goroutine profile 看栈

pprof 的 goroutine 页面会显示大量 goroutine 卡在哪个函数。常见位置包括 channel send/receive、HTTP 读取、数据库查询和 time.After。

修复要回到生命周期

看到栈之后,不要只想着关闭 channel。真正的问题通常是没有 context、没有消费方、没有退出协议或没有超时。

生产场景

适用于接口上线后 goroutine 数量持续上升、发布后内存缓慢增长或流量回落但资源不回落的排查。pprof 能把抽象的泄漏变成具体栈。

关键指标

  • runtime.NumGoroutine 趋势和回落时间
  • goroutine profile 中相同栈数量
  • 阻塞在 channel、HTTP、SQL、timer 的占比

常见误区

  • 只在事故后临时打开 pprof
  • 看到 channel 阻塞就盲目 close channel
  • 用 time.After 在循环里制造难回收 timer

落地建议

建议在内网或鉴权后长期保留 pprof,并给 goroutine 数量设置趋势报警。定位后从生命周期修复:补 context、补消费端、补退出协议,而不是只处理表面栈。

代码示例

go func() {
    

上线检查

  • 服务暴露受保护的 pprof。
  • goroutine 数量进入监控。
  • 每个后台 goroutine 都有退出条件。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>