登录
首页 >  Golang >  Go教程

Go 阻塞画像与调度分析:定位 goroutine 等待

来源:Golang学习网专题原创

时间:2026-06-09 13:47:51 425浏览 收藏

所属专题:Go 性能优化实战

CPU profile 只能看到正在运行的代码,看不到大量 goroutine 为什么没运行。阻塞画像和 runtime trace 适合回答另一个问题:时间花在等待什么。

Go 阻塞画像与调度分析:定位 goroutine 等待

block profile 看等待

block profile 可以暴露 goroutine 阻塞在 channel send/receive、select、锁等待等位置。它适合定位吞吐不高但 CPU 也不高的场景。

trace 看调度过程

runtime/trace 可以看到 goroutine 的 runnable、running、syscall、blocked 状态切换,对分析调度延迟和系统调用等待很有帮助。

等待不一定能消除

有些等待是合理背压,有些是错误的串行化。优化时要区分保护性等待和无意义阻塞。

生产场景

适用于 CPU 不高但请求慢、队列堆积、goroutine 很多却吞吐上不去的场景。

关键指标

  • blocked goroutine 数量
  • channel/lock/syscall 等待占比
  • runnable 到 running 的延迟

常见误区

  • 只看 CPU profile
  • 把所有等待都当成坏事
  • 线上长期高频开启 trace

代码示例

runtime.SetBlockProfileRate(1)
// 采样窗口结束后恢复默认值
runtime.SetBlockProfileRate(0)
// 或使用 go test -trace trace.out

上线检查

  • 优化前后必须保留同一条件下的 benchmark 或 profile。
  • 至少观察 P95/P99、错误率、CPU、内存和 GC 指标。
  • 如果改动影响热路径,必须准备灰度和回滚方案。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>