GoLand 2026.1 Help

阻塞分析器

阻塞分析器显示 goroutine 未运行而处于等待状态的时间段。 这对于识别由无缓冲或已满 channel、 sync.Mutex 锁或其他同步问题导致的性能瓶颈非常有用。

GoLand 会收集并可视化 CPU 分析、跟踪和堆分析数据。 为了收集所有必要的数据,GoLand 使用了 pprof 包。 GoLand 包含四种分析器,您可以通过用户界面运行它们:CPU、内存、阻塞(争用)和互斥锁。

性能分析结果有助于定位性能问题,但代码优化必须手动完成。 有关更多信息,请参阅 go.dev 上的 Profilingpkg.go.dev 上对 pprof 包的介绍

分析完成后,分析器会在报告中可视化显示结果。

在开始之前

在运行性能分析前,请确保:

  • 已安装 Go,您可以使用 GOROOT 文章安装、升级或配置 Go。 欲了解更多信息,请参阅 GOROOT

  • GoLand 已 安装在您的计算机上。

  • 您希望分析的 Go 项目已在 IDE 中打开。

本主题中的所有示例可在 GitHub 上的示例项目中找到。

阻塞性能分析

阻塞分析器可帮助您检测由 goroutine 等待无缓冲 channel、同步原语或其他阻塞操作引起的延迟。 它显示了代码因等待而未执行的时间及位置。

示例程序

以下程序模拟一个通过 channel 发送值的生产者以及一个逐个处理数据的慢消费者。 由于消费者较慢,生产者在尝试发送新数据时经常会被阻塞:

import "time" var Ch = make(chan int) func InefficientConsumer() { for val := range Ch { time.Sleep(time.Second) // slow processing println("Received:", val) } } func InefficientProducer() { for i := 0; i < 5; i++ { Ch <- i } close(Ch) }

运行此代码会立即输出结果,但在内部,生产者 goroutine 在等待消费者准备好时经常会暂停。

创建用于分析的测试

若要分析阻塞行为,请为程序创建一个单元测试:

package main import "testing" func TestInefficientConsumer(t *testing.T) { go InefficientProducer() InefficientConsumer() } func TestEfficientConsumer(t *testing.T) { go EfficientProducer() EfficientConsumer() }

运行阻塞分析器

  1. 请打开 _test.go 文件。

  2. 点击测试函数旁边边距中的 运行 图标。

  3. 请选择 使用 Blocking Profiler 进行性能分析

    运行阻塞分析器

分析阻塞性能分析结果

GoLand 以三种视图展示阻塞分析数据:

  • 火焰图 :显示函数调用及 goroutine 等待(未运行)所花费的时间。 每个块表示堆栈中的一个函数。 纵轴表示堆栈深度(自底向上),横轴表示按升序排列的堆栈分析视图——可以按延迟次数(争用 已选择)或总等待时间(延迟 已选择)排序。

    火焰图 选项卡中,将鼠标悬停在任意块上以查看详细信息。

  • 调用树 :可视化函数之间的调用关系,显示每个函数的延迟次数(争用 )或总等待时间(延迟)。 数据以降序排列,以突出显示最耗时的操作。 若要配置或筛选 调用树 视图,请使用 表示设置 按钮 “显示设置”按钮

  • 方法列表 :按竞争次数对所有方法进行排序。 反向跟踪 选项卡显示已选择方法的调用位置,而 合并的被调用方 选项卡则显示从该方法发起的所有调用轨迹。 被调用方列表 是汇总调用层次结构中所有方法的方法列表。

优化并比较结果

要解决阻塞问题,您可以使用带缓冲的 channel,使生产者能在消费者处理前先发送多个值:

var BufCh = make(chan int, 3) func EfficientProducer() { for i := 0; i < 5; i++ { BufCh <- i } close(BufCh) } func EfficientConsumer() { for val := range BufCh { time.Sleep(time.Second) // slow processing println("Received:", val) } }

重新运行阻塞分析器后,火焰图显示的阻塞事件更少,等待时间更短。 这验证了对 channel 进行缓冲有助于减少同步延迟。

重新运行阻塞分析器

将带缓冲 channel 的使用与之前的实现进行比较。

运行阻塞分析器
2026年 3月 26日