性能分析简介
分析是一种运行时分析,它针对大量运行时数据进行操作,并能让您从全局视角了解进程内部的情况。 收集的数据涉及程序运行的各个切面,例如 CPU 用法、内存分配和 goroutine 活动。
分析可以是瞬时的,比如捕获内存快照,也可以是长期运行的。
何时进行性能分析有帮助?
性能分析工具帮助您:
识别瓶颈并诊断性能问题
识别热点和优化机会,不一定与性能问题有关
更好地理解程序在底层的运行方式
可用分析文件夹
GoLand 使用 runtime/pprof 软件包的内置分析文件夹。 每个分析文件夹收集一种特定类型的性能数据。

CPU 分析
处理器 分析显示程序消耗 CPU 时间的地方。
使用 Go 分析器创建的分析快照可以通过不同的采样类型进行查看。
CPU 时间 显示 CPU 执行某个函数所花费的时间。 该值由采样数据派生,表示估算的执行时间。 使用此采样类型可以识别 CPU 密集型代码路径并优化算法。
样本 显示某个函数在采集样本中出现的次数。 分析器会定期捕获调用堆栈,每次捕获为一次样本。 样本数量越多,说明该函数在执行期间被观察到的次数越多。 使用此采样类型可以快速检测热点。
有助于查找主动执行工作的函数,而不是等待 I/O 或同步的函数。
堆和 Allocs 分析
堆 和 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 运行时已证明无法恢复执行的 goroutine,例如由于被阻塞在其它 goroutine 无法访问的 channel 或锁上。
与 Goroutine 分析会列出采集时存在的所有 goroutine 不同, Goroutine 泄漏 分析只报告垃圾回收器判定为无法访问且永久阻塞的 goroutine。 这样可以避免仅处于空闲但仍能恢复的 goroutine 引起的误报。
使用此分析查找 goroutine 泄漏:随时间积累且未被清理,逐步耗尽内存和其他资源的 goroutine。
此性能分析文件会检测一大类泄漏,但可能会漏掉在同步原语上被阻塞的 goroutine,该同步原语可通过全局变量或 runnable goroutine 访问。
阻塞分析
块 分析显示 goroutine 等待同步原语时消耗的时间。
同步原语是一种用于协调 goroutine 工作并控制对共享数据访问的机制。 在 Go 中常见的示例有 channel、 sync.Mutex、 sync.RWMutex、 sync.WaitGroup 和 sync.Cond。
它会跟踪等待 channel 发送和接收、锁以及其他同步操作时所花费的时间。
使用此分析查找由同步及 goroutine 间等待引起的延迟。
可用的采样类型如下:
延迟 :goroutine 在同步原语上被阻塞等待的累计时间。
争用 :同步等待事件的数量。
详细信息请参阅 阻塞分析。
锁分析
Mutex 分析显示锁争用情况。
互斥锁是一种用于保护共享数据的锁。 当多个 goroutine 同时尝试获取同一个锁时就会出现争用。 如果一个 goroutine 已经持有锁,其他 goroutine 必须等到释放该锁以后才能获取。
使用此分析查找由锁争用和过度同步导致的延迟。
要调查并发问题,请比较 Goroutine、 块 和 Mutex 性能分析文件。 Goroutine 性能分析文件显示当前堆栈跟踪, 块 性能分析文件显示 goroutine 的等待位置, Mutex 性能分析文件显示持有争用锁的代码。
要调查并发问题,请比较 Goroutine、 块 和 Mutex 性能分析文件。 Goroutine 性能分析文件显示当前堆栈跟踪, 块 性能分析文件显示 goroutine 的等待位置, Mutex 性能分析文件显示持有争用锁的代码。
可用的采样类型如下:
延迟 :goroutine 在尝试获取竞争中的锁时等待的累计时间。
争用 :获取锁时发生竞争的次数。
更多详细信息,请参阅 互斥锁分析。
配置 Go 分析器
你可以在 IDE 设置中配置 Go 分析器。 设置定义了配置文件的存储位置以及分析器收集数据的频率。
为应用程序配置分析
按 Ctrl+Alt+S 打开设置并导航到 。
配置全局分析参数:
默认分析文件目录 定义了 IDE 存储捕获分析的位置。
内存分析采样率 定义分析器采样内存分配的频率。
此值指定两次记录分配之间的平均字节数。 较小的值会增加细节和开销。 默认值为 512 KB。
阻塞分析采样率 定义分析器记录阻塞事件的频率。
该值以纳秒为单位。 将值设置得较小可以记录更多事件。
互斥锁分析比例 定义分析器记录的互斥锁争用事件数量。
该值控制采样比率。 例如,值为 10 表示分析器记录十个事件中的一个。
为测试配置分析
按 Ctrl+Alt+S 打开设置并导航到 。
为测试运行配置分析器:
CPU 分析器 在测试执行期间记录 CPU 用法。
内存分析器 记录内存分配。
使用 分析速率 定义分析器采样分配的频率。 将值设置为
1可记录所有分配。 字段留空则使用默认值(512 KB)。阻塞分析器 记录阻塞事件。
当 goroutine 等待资源(如 channel 或锁)时会发生阻塞事件。
使用 分析速率 定义分析器采样阻塞事件的频率。 将值设置为
1可记录所有事件。Mutex 分析器 记录互斥锁争用情况。
当多个 goroutine 尝试获取同一个锁时,会发生互斥锁争用。
使用 分析分数比率 定义分析器记录的事件比例。 例如,值为 10 表示分析器记录十个事件中的一个。
分析的工作原理
GoLand 使用标准 Go runtime/pprof 软件包收集性能分析数据。
启动分析时,IDE 会用临时覆盖层构建你的应用程序。 覆盖层在构建中 inject 分析钩子,无需修改你的源文件。
分析器使用单独的本地服务器与 IDE 通信。 启动性能分析不会向应用程序的 HTTP 服务器添加 /debug/pprof/ 端点。 应用程序自行注册的端点独立于 IDE 分析器。
Go 分析器仅分析由 GoLand 启动的进程。 它无法附加到已在运行的进程。
IDE 运行类似于以下内容的命令:
覆盖文件定义了启用分析的临时更改。 GoLand 在运行完成后移除这些更改。