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

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.Mutex、 sync.RWMutex、 sync.WaitGroup 和 sync.Cond。
分析器会跟踪花费的时间被阻塞于如 channel 发送和接收、锁及其他同步操作上。
使用此分析器查找因同步和 goroutine 间等待导致的延迟。
可用的采样类型如下:
延迟 :goroutine 在同步原语上被阻塞等待的累计时间。
争用 :同步等待事件的数量。
详细信息请参阅 阻塞分析。
Mutex 分析器
Mutex 分析器显示锁争用情况。
互斥锁是一种用于保护共享数据的锁。 当多个 goroutine 同时尝试获取同一个锁时就会出现争用。 如果一个 goroutine 已经持有锁,其他 goroutine 必须等到释放该锁以后才能获取。
使用此分析器查找因锁竞争和过度同步导致的延迟。
可用的采样类型如下:
延迟 :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 pprof 工具收集分析数据。
启动分析时,IDE 会用临时覆盖层构建你的应用程序。 覆盖层在构建中 inject 分析钩子,无需修改你的源文件。
IDE 运行类似于以下内容的命令:
覆盖文件定义了启用分析的临时更改。 GoLand 在运行完成后移除这些更改。