go 的内存剖析(heap profiling)默认启用但采样率极低(memprofilerate=512kb),几乎无性能开销;cpu 剖析则完全惰性——仅调用 `pprof.startcpuprofile()` 时才启动。二者均非“常驻监控”,不存在隐式持续开销。
在 Go 程序中,剖析(profiling)机制的设计遵循按需启用、最小侵入原则,并非传统意义上的“Always On”。理解其行为对构建高性能、可观测服务至关重要。
runtime/pprof 的 CPU 剖析严格依赖显式调用:
f, _ := os.Create("cpu.pprof")
pprof.StartCPUProfile(f)
// ... 业务逻辑 ...
pprof.StopCPUProfile()⚠️ 关键点:若全程未调用 StartCPUProfile(),运行时完全不采集任何 CPU 样本,无 goroutine 调度钩子、无定时器、无额外内存分配——绝对零开销。
Go 运行时通过全局变量 runtime.MemProfileRate 控制堆内存采样频率。其默认值为 512KB(即每分配约 512

可通过代码动态关闭(如启动时根据 flag 决定):
if !*enableMemProfiling {
runtime.MemProfileRate = 0 // 完全禁用内存采样
}或使用环境变量(Go 1.5+):
GODEBUG=memprofilerate=0 ./myapp
? 补充说明:pprof.WriteHeapProfile() 仅是快照导出操作(写入当前堆状态),它本身不触发采样——采样由 MemProfileRate 在运行时自动完成。因此,“只在 exit 调用 WriteHeapProfile” 并不意味着“之前没采样”。
总之,Go 的剖析设计哲学是“默认轻量、启用明确、控制灵活”——既保障故障可追溯性,又绝不牺牲常态性能。