goland中cpu采样时间是总时长而非间隔,需在run→edit configurations→profiling中设置“cpu sampling duration”(如120秒),默认30秒易遗漏热点;该配置仅对net/http/pprof生效,不支持修改采样频率(固定100hz)。

GoLand里CPU采样时间不是“间隔”,而是总时长
很多人误以为 GoLand 的 CPU profiling 有个“采样频率设置”,其实它调用的是 go tool pprof,而该工具对 HTTP 接口(/debug/pprof/profile)的默认行为是:**固定采集 30 秒,采样率固定为 100Hz(即每 10ms 抓一次栈)**。你不能改“间隔”,但必须改“总时长”——否则短任务可能根本没采到热点,长任务又会提前中断。
- GoLand 的 UI 配置项叫 “CPU Sampling Duration”,位置在
Run → Edit Configurations → Profiling → CPU Sampling Duration - 值填
120表示采 120 秒;填0表示不限时(不推荐,可能卡死) - 若你在代码里手动用了
pprof.StartCPUProfile,GoLand 的这个配置就完全不起作用——它只影响通过net/http/pprof启动的 profile - 注意:GoLand 2026.2 及之后版本,该字段支持小数(如
45.5),但底层仍以秒为单位向上取整启动
为什么改了时长还是只采了 30 秒?
常见原因是服务本身在 30 秒内就退出了,或者你启用了 profile 但没触发实际请求。GoLand 的 Run → Profile 功能本质是向 http://localhost:6060/debug/pprof/profile 发 GET 请求并等待响应,如果目标进程没监听 6060 端口、或 handler 被拦截、或进程提前 exit,就会 fallback 到默认 30 秒后强制结束。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 确认你的程序已 import
_ "net/http/pprof",且执行了http.ListenAndServe("localhost:6060", nil) - 启动后先 curl 一下:
curl -s http://localhost:6060/debug/pprof/ | head -10,看是否返回 HTML 列表 - 如果用的是自定义 mux(比如 gorilla/mux),要显式注册:
r.HandleFunc("/debug/pprof/", pprof.Index) - GoLand 默认超时是 35 秒,若后端响应慢于这个值,它会主动断开——此时日志里会出现
Failed to fetch profile: context deadline exceeded
profile 参数怎么传给 pprof 才生效?
GoLand 底层拼的是 URL 查询参数,不是命令行 flag。比如你想强制 GC 后采 heap,得让 GoLand 请求 http://localhost:6060/debug/pprof/heap?gc=1,但它不提供 UI 填这个。所以:
- CPU profile 不支持加
?seconds=参数——GoLand 固定用?seconds=30(或你设的值),且不可覆盖 - Heap profile 可以手动 curl:
curl -o mem.pprof 'http://localhost:6060/debug/pprof/heap?gc=1',这才是查泄漏的正确姿势 - 想改采样率(比如从 100Hz 改成 50Hz)?不行。
runtime.SetCPUProfileRate只对runtime/pprof生效,对net/http/pprof无效 - 真正能灵活控制的,是写个独立脚本调用
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=120
长时间运行任务的 profile 容易漏掉关键阶段
比如一个批处理跑 8 分钟,但前 2 分钟初始化、中间 5 分钟计算、最后 1 分钟收尾。如果你只采 30 秒,默认大概率落在初始化或收尾段——因为它们更“安静”,协程调度更容易被采中;而真正高负载的计算段反而因调度密集、栈深、采样碰撞多,样本稀疏。
- 解决办法不是拉长总时长,而是分段采:在业务逻辑关键节点插入
pprof.Lookup("goroutine").WriteTo(f, 1)或打日志标记时间点 - 用
go tool pprof -symbolize=stripes(Go 1.26+)可缓解符号丢失导致的函数名模糊问题 - 如果用 GoLand 的 “Attach to Process” 模式做 profiling,它无法指定开始/结束时间点,纯靠你手动点 Stop——这意味着你得紧盯控制台输出,错过就重来










