性能分析简介
性能分析是一种运行时分析,处理大量运行时数据,并让您从全局视角了解进程内部发生的情况。 收集的数据与程序运行的各个方面有关,如 CPU 使用率、内存 %a 分配和线程活动。
分析可以是瞬时的,比如捕获内存快照,也可以是长期运行的。 例如,CPU 分析器可以在任意长的时间段内收集数据,比如数小时甚至数天的程序运行期间。
何时进行性能分析有帮助?
性能分析工具帮助您:
识别错误、瓶颈并诊断性能问题
识别热点和优化机会,不一定与性能问题有关
评估或比较不同解决方案的性能
更好地理解程序在底层的运行方式
可用分析器。
GoLand 使用 runtime/pprof 软件包中的内置分析器。 每个分析器收集特定类型的性能数据。

处理器 分析器显示程序在使用 CPU 时消耗时间的位置。
有助于查找主动执行工作的函数,而不是等待 I/O 或同步的函数。
堆 分析器报告内存用法。
显示已分配的内存和仍在使用的内存。 分配是指申请内存,例如创建切片或结构体时。 使用此分析器可检测高内存用法和内存泄漏。
Allocs 分析器随着时间的推移报告所有内存分配。
有助于查找创建大量对象的代码,即使这些对象生命周期很短。
Goroutine 分析器显示所有当前 goroutine 的堆栈跟踪。
Goroutine 是由 Go 运行时管理的轻量级线程。 使用此分析器可理解并发并检测卡住或异常的 goroutine。
块 分析器显示 goroutine 等待的位置。
阻塞操作会暂停执行直到满足某个条件。 例如,goroutine 可以等待 channel、锁或 I/O。 此分析器有助于查找由同步导致的延迟。
Mutex 分析器显示锁争用情况。
互斥锁是一种用于保护共享数据的锁。 当多个 goroutine 同时尝试获取同一个锁时就会出现争用。 此分析器有助于查找由加锁导致的延迟。
Threadcreate 分析器显示程序创建操作系统线程的位置。
使用此分析器可检测线程创建过多并了解运行时如何调度工作。
配置 Go 分析器
你可以在 IDE 设置中配置 Go 分析器。 设置定义了配置文件的存储位置以及分析器收集数据的频率。
为应用程序配置分析
按 Ctrl+Alt+S 打开设置并导航到 。
配置全局分析参数:
默认分析文件目录 定义了 IDE 存储捕获分析的位置。
内存分析采样率 定义分析器采样内存分配的频率。
此值指定两次记录分配之间的平均字节数。 较小的值会增加细节和开销。 默认值为 512 KB。
阻塞分析采样率 定义分析器记录阻塞事件的频率。
该值以纳秒为单位。 将值设置得较小可以记录更多事件。
互斥锁分析比例 定义分析器记录的互斥锁争用事件数量。
该值控制采样比率。 例如,值为 10 表示分析器记录十个事件中的一个。
为测试配置分析
按 Ctrl+Alt+S 打开设置并导航到 。
为测试运行配置分析器:
CPU 分析器 在测试执行期间记录 CPU 用法。
内存分析器 记录内存分配。
使用 分析速率 定义分析器采样分配的频率。 将值设置为
1可记录所有分配。 字段留空则使用默认值(512 KB)。阻塞分析器 记录阻塞事件。
阻塞事件发生在 goroutine 等待资源,如 channel、锁或 I/O 时。
使用 分析速率 定义分析器采样阻塞事件的频率。 将值设置为
1可记录所有事件。Mutex 分析器 记录互斥锁争用情况。
当多个 goroutine 尝试获取同一个锁时,会发生互斥锁争用。
使用 分析分数比率 定义分析器记录的事件比例。 例如,值为 10 表示分析器记录十个事件中的一个。
分析的工作原理
GoLand 使用标准 Go pprof 工具收集分析数据。
启动分析时,IDE 会用临时覆盖层构建你的应用程序。 覆盖层在构建中 inject 分析钩子,无需修改你的源文件。
IDE 运行类似于以下内容的命令:
覆盖文件定义了启用分析的临时更改。 GoLand 在运行完成后移除这些更改。