GoLand 2026.2 Help

性能分析简介

分析是一种运行时分析,它针对大量运行时数据进行操作,并能让您从全局视角了解进程内部的情况。 收集的数据涉及程序运行的各个切面,例如 CPU 用法、内存分配和 goroutine 活动。

分析可以是瞬时的,比如捕获内存快照,也可以是长期运行的。

何时进行性能分析有帮助?

性能分析工具帮助您:

  • 识别瓶颈并诊断性能问题

  • 识别热点和优化机会,不一定与性能问题有关

  • 更好地理解程序在底层的运行方式

可用分析器。

GoLand 使用 runtime/pprof 软件包中的内置分析器。 每个分析器收集特定类型的性能数据。

Go 性能优化工具窗口中的可用分析器

CPU 分析器

处理器 分析器展示了程序消耗 CPU 时间的位置。

使用 Go 分析器创建的分析快照可以通过不同的采样类型进行查看。

  • CPU 时间 显示 CPU 执行某个函数所花费的时间。 该值由采样数据派生,表示估算的执行时间。 使用此采样类型可以识别 CPU 密集型代码路径并优化算法。

  • 样本 显示某个函数在采集样本中出现的次数。 分析器会定期捕获调用堆栈,每次捕获为一次样本。 样本数量越多,说明该函数在执行期间被观察到的次数越多。 使用此采样类型可以快速检测热点。

有助于查找主动执行工作的函数,而不是等待 I/O 或同步的函数。

堆和分配分析器

Allocs 分析器报告运行时收集的内存分配数据。

这两种分析器使用相同的分配事件。 不同之处在于默认的采样类型:

  • 使用 in-use space 并显示当前被程序占用的内存。

  • Allocs 使用 allocated space 并显示随着时间推移总共分配的内存,包括已被释放的内存。

使用这些分析器分析内存用法并查找频繁分配的代码。 详细信息请参阅 堆分析分配分析

GoLand 提供两种收集堆分析快照的方法:

  • 堆(带 GC) 在收集分析快照前运行垃圾回收。 使用此选项可以分析清理后仍被保留的内存。

  • 堆(不带 GC) 会在不强制垃圾回收的情况下收集分析快照。 使用此选项可以查看当前未清理的内存状态。

Allocs 分析器支持以下采样类型:

  • 分配的对象 (alloc_objects ):已分配对象的数量。

  • 分配的空间alloc_space ):已分配内存总量。

  • 在用对象inuse_objects ):当前内存中的对象数量。

  • 在用空间 (inuse_space ):当前正在使用的内存。

Goroutine 分析器

Goroutine 分析器显示所有当前 goroutine 的堆栈跟踪。

Goroutine 是由 Go 运行时管理的轻量级线程。 使用此分析器可理解并发并检测卡住或异常的 goroutine。

阻塞分析器

分析器展示了 goroutine 在同步原语上等待的时间。

同步原语是一种用于协调 goroutine 工作并控制对共享数据访问的机制。 在 Go 中常见的示例有 channel、 sync.Mutexsync.RWMutexsync.WaitGroupsync.Cond

分析器会跟踪花费的时间被阻塞于如 channel 发送和接收、锁及其他同步操作上。

ch := make(chan int) go func() { ch <- 42 // blocks until another goroutine receives }() value := <-ch

使用此分析器查找因同步和 goroutine 间等待导致的延迟。

可用的采样类型如下:

  • 延迟 :goroutine 在同步原语上被阻塞等待的累计时间。

  • 争用 :同步等待事件的数量。

详细信息请参阅 阻塞分析

Mutex 分析器

Mutex 分析器显示锁争用情况。

互斥锁是一种用于保护共享数据的锁。 当多个 goroutine 同时尝试获取同一个锁时就会出现争用。 如果一个 goroutine 已经持有锁,其他 goroutine 必须等到释放该锁以后才能获取。

var mu sync.Mutex go func() { mu.Lock() time.Sleep(time.Second) mu.Unlock() }() go func() { mu.Lock() // waits because another goroutine holds the lock mu.Unlock() }()

使用此分析器查找因锁竞争和过度同步导致的延迟。

可用的采样类型如下:

  • 延迟 :goroutine 在尝试获取竞争中的锁时等待的累计时间。

  • 争用 :获取锁时发生竞争的次数。

更多详细信息,请参阅 互斥锁分析

配置 Go 分析器

你可以在 IDE 设置中配置 Go 分析器。 设置定义了配置文件的存储位置以及分析器收集数据的频率。

为应用程序配置分析

  1. Ctrl+Alt+S 打开设置并导航到 构建、执行、部署 | 分析器 | Go 分析器:应用程序

  2. 配置全局分析参数:

    • 默认分析文件目录 定义了 IDE 存储捕获分析的位置。

    • 内存分析采样率 定义分析器采样内存分配的频率。

      此值指定两次记录分配之间的平均字节数。 较小的值会增加细节和开销。 默认值为 512 KB。

    • 阻塞分析采样率 定义分析器记录阻塞事件的频率。

      该值以纳秒为单位。 将值设置得较小可以记录更多事件。

    • 互斥锁分析比例 定义分析器记录的互斥锁争用事件数量。

      该值控制采样比率。 例如,值为 10 表示分析器记录十个事件中的一个。

为测试配置分析

  1. Ctrl+Alt+S 打开设置并导航到 构建、执行、部署 | 分析器 | Go 分析器:测试

  2. 为测试运行配置分析器:

    • CPU 分析器 在测试执行期间记录 CPU 用法。

    • 内存分析器 记录内存分配。

      使用 分析速率 定义分析器采样分配的频率。 将值设置为 1 可记录所有分配。 字段留空则使用默认值(512 KB)。

    • 阻塞分析器 记录阻塞事件。

      当 goroutine 等待资源(如 channel 或锁)时会发生阻塞事件。

      使用 分析速率 定义分析器采样阻塞事件的频率。 将值设置为 1 可记录所有事件。

    • Mutex 分析器 记录互斥锁争用情况。

      当多个 goroutine 尝试获取同一个锁时,会发生互斥锁争用。

      使用 分析分数比率 定义分析器记录的事件比例。 例如,值为 10 表示分析器记录十个事件中的一个。

分析的工作原理

GoLand 使用标准 Go pprof 工具收集分析数据。

启动分析时,IDE 会用临时覆盖层构建你的应用程序。 覆盖层在构建中 inject 分析钩子,无需修改你的源文件。

IDE 运行类似于以下内容的命令:

GOROOT=/path/to/go GOPATH=/path/to/gopath go build -overlay /tmp/goland_overlay.json -o /tmp/binary /tmp/binary

覆盖文件定义了启用分析的临时更改。 GoLand 在运行完成后移除这些更改。

2026年 7月 14日