GoLand 性能分析器现已支持 AI 智能体
在 Go 性能分析实践指南 中,我们提到,有些接受采访的 Go 开发者会尽可能避开 pprof。对他们中的许多人来说,典型的 Go 服务即使不做优化也运行得足够好,因此当他们确实需要做性能分析时,感觉就像一场使用自己并不十分熟悉的工具进行的“救援任务”。他们必须记住该采集哪种分析数据、如何采集,然后再去理解大量底层数据。
GoLand 2026.1.2 通过内置性能分析器让采集部分变得更简单。在 GoLand 2026.3 中,我们更进一步——你的 AI 智能体现在也能使用这个分析器。你描述症状,例如“通过 POST /reindex 重建索引的耗时远超预期,对它做性能分析”,智能体就会使用分析器运行你的应用,选择适合该问题的分析类型,读取结果,并指出导致问题的代码。你不需要知道互斥锁分析数据是什么,也不需要知道该传哪些 pprof 标志。
这可通过随附的 goland-profiler 技能和一组 MCP 工具,与 Claude Code、Codex 和 Junie 配合使用。下面我们进一步看看智能体会做什么,以及你可以如何与它分工。
当你让智能体对应用做性能分析时,会发生什么?
goland-profiler 技能会告诉智能体何时该使用性能分析器,例如执行缓慢、CPU 使用率高、分配过多、内存增长、阻塞、锁争用或 goroutine 泄漏。它还说明了如何使用让智能体能够访问 GoLand 性能分析器的 MCP 工具。一次典型的运行过程如下:
- 使用性能分析器运行: 如果你已经用性能分析器启动了应用,智能体会复用那次运行。否则,它会使用你的运行配置,像你点击 Run with Profiler 按钮一样,用性能分析器启动应用。该技能明确要求智能体不要添加
net/http/pprof或任何临时性能分析代码,因此你的源代码保持不变。如果不清楚应用是否按预期运行,智能体也可以读取其输出。 - 选择分析类型: 该技能指导智能体采集能回答当前问题的最小范围数据。对于 CPU 问题,这意味着在运行工作负载(例如负载生成器)时进行记录,或者在负载稳定时采集定时分析数据。对于其他问题,它会采集用于同步等待的阻塞分析数据、用于锁争用的互斥锁分析数据,或在内存持续增长时采集两份堆分析数据进行对比。分配、goroutine 和 goroutine 泄漏分析数据也可用。
- 读取结果: 每次采集都会返回一份摘要,最多包含你代码中最热的五个函数,显示它们的开销分布在哪里、哪些代码行最昂贵,以及它们是如何被调用到的。智能体会从这份摘要开始,只在摘要不够时才请求更多细节——某个给定根节点下的顶级函数、通往某个函数的调用路径,或某个函数中最昂贵的代码行。
- 报告发现: 智能体会告诉你主要瓶颈是什么、开销有多大、你代码中哪条调用路径导致了它、热点代码行在哪里,以及它属于 CPU 计算、内存分配、阻塞、争用还是 goroutine 增长。它还会建议修复方案或进一步的测量,并且被要求将性能分析数据所显示的内容与它自己的假设区分开。如果你提出要求,它也可以直接进行修改。
智能体采集的每一份分析数据都会进入性能分析器会话,以及 Go Optimization 工具窗口中的 Recent profiles,就像你自己采集的一样。如果你想要复核智能体的结论,可以打开同一份分析数据并查看火焰图。
MCP 工具
使用性能分析器运行应用
使用性能分析器启动和停止应用,方式与 Run with Profiler 按钮相同。你的源代码不会被更改。
run_with_profiler:启动一个启用了性能分析器的运行配置。list_profiled_runs:列出活动和最近停止的性能分析运行,包括你从 IDE 启动的运行。get_profiled_run_output:返回性能分析运行的程序输出,例如应用日志。stop_profiled_run:停止正在被分析的应用。
采集分析数据
将采集到的分析数据保存到会话和 Recent profiles,以便你之后在 GoLand 中打开。
take_profile:采集一份分析数据(快照,或指定时长的 CPU 性能分析数据),并连同摘要一起返回。start_cpu_recording:开始 CPU 记录。stop_cpu_recording:停止记录,保存 CPU 性能分析数据,并返回摘要。
读取分析数据
可处理任何分析数据——智能体采集的、你采集的,或当前在编辑器中打开的那一份。
list_profiles:列出会话、最近和当前打开的分析数据。profile_summary:返回任意已保存分析数据的总计信息,以及开销最高的 5 个函数及其热点代码行和调用路径。profile_top_frames:按自身开销或累计开销对函数排序,类似于pprof -top。profile_call_paths:显示通往给定函数的调用路径。profile_source_lines:按开销对某个函数的源代码行排序,类似于pprof -list。
如何与智能体分工
你可以决定把流程中的多少工作交给智能体。以下是我们发现的三种最有用的方式:
- 智能体包办一切: 你描述问题,智能体处理其余所有事情,从启动应用到解释结果。当你不知道从哪里开始时,这是一个很好的选择。
- 你来做性能分析,智能体来分析: 你自己运行性能分析器,打开一份分析数据,然后问智能体它看到了什么。智能体可以读取当前打开的分析数据,因此不需要导出或描述任何内容。
- 你来运行应用,智能体来采集: 你使用性能分析器启动应用,并让它进入你关心的状态,例如预热之后,或加载了类似生产环境的数据集之后,然后让智能体采集分析数据。
工作流:与智能体分工的三种方式
智能体包办一切
当你知道有地方慢,但完全不知道从哪里入手时很有用。
- 你:“通过
POST /reindex重建索引的耗时远超预期。对应用做性能分析,并告诉我原因。” - 智能体:加载
goland-profiler,选择一个运行配置,并调用run_with_profiler。你的代码保持不变。 - 智能体:向应用发送一些负载,使用
start_cpu_recording和stop_cpu_recording记录 CPU;如果症状指向内存,还会采集堆或分配分析数据。每次采集都会返回一份摘要,其中包含最热的函数和调用路径。 - 智能体:如果摘要不够,就用
profile_top_frames、profile_call_paths或profile_source_lines深入分析,然后停止它启动的应用。 - 智能体:解释什么慢以及为什么慢;如果你要求,还可以修复问题。分析数据会保留在 GoLand 中,你可以打开并检查。
你来做性能分析,智能体来分析
你掌控运行过程,智能体帮助你理解已经打开的分析数据。
- 你:使用性能分析器运行应用,复现慢请求,并照常采集一份分析数据。
- 你:打开分析数据。火焰图里有些地方看起来不对劲,但你不确定是什么。
- 你:“看看当前打开的分析数据。为什么我们分配了这么多内存?”
- 智能体:通过
list_profiles找到当前打开的分析数据,用profile_summary读取它;如果摘要不够,再用profile_top_frames、profile_call_paths或profile_source_lines深入分析。它读取的就是你正在查看的同一份分析数据。 - 智能体:结合你的代码解释热点路径,并建议修复方案。
你来运行应用,智能体来采集
你使用性能分析器启动应用,并让它进入你关心的状态,然后由智能体接手。
- 你:使用性能分析器启动应用,并让它进入正确的状态,例如预热之后,或加载了类似生产环境的数据集之后。
- 你:“它现在正使用性能分析器运行。采集 goroutine 和互斥锁分析数据,并告诉我争用发生在哪里。”
- 智能体:用
list_profiled_runs找到你的运行,然后针对每种分析类型调用take_profile。 - 智能体:读取分析数据,对照源代码检查,然后向你报告。应用会继续运行,直到你停止它。
当前限制
- 由 GoLand 启动的应用: GoLand 的性能分析器会在编译期间修改可执行文件,以公开性能分析 API,因此无法附加到已经运行的进程。智能体要么通过启用了性能分析器的运行配置启动应用,要么使用你自己启动的会话。
- 运行时间很短的程序: 性能分析器会对运行中的进程进行采样,因此一个在零点几秒内就结束的 CLI 工具没有足够时间采集到有用的数据。该技能最适合服务器、工作进程和其他长时间运行的服务。
- 已测试的智能体: 我们已使用 Claude Code、Codex 和 Junie 测试过该工作流。其他能够连接到 GoLand MCP 服务器的智能体也可能可用,但我们尚未验证。
如何试用
- 更新到 GoLand 2026.3 并打开你的项目。
- 确保在 Settings | AI | Skills 中启用了
goland-profiler。你也可以在那里将其限制为特定项目,或将其关闭。 - 让你的智能体对应用做性能分析,或者打开一份你已经采集的分析数据,问智能体它看到了什么。
告诉我们你的想法
我们希望这能让性能分析成为你日常工作的一部分,而不仅仅是在服务已经出问题时才做的事。如果你一直避免使用性能分析器,现在可能是一个不错的尝试时机。
我们很想听听它在你那里效果如何——你最终采用了哪种分工方式,智能体的摘要是否足够,还是你仍然会打开火焰图,以及它在哪些项目上不适用。欢迎在 X 上标记我们,加入 #goland-gophers Slack 频道,或在我们的 YouTrack 问题跟踪器 中创建工单。
编码愉快,
GoLand 团队