Go pprof 性能剖析与火焰图实战:从 CPU 采样到内存泄漏定位的完整指南
Go 服务上到生产环境,CPU 一冲就 100%、接口 P99 突然拉长 5 倍、内存隔三差五就涨一波再回不来——这种"玄学"问题光靠 `top` 和 `free -m` 是看不出来的。Go 内置的 `runtime/pprof` 是定位这类问题的杀手锏,它能告诉你 CPU 时间到底花在了哪个函数、内存被谁吃掉、Goroutine 卡在哪条通道上。本文从最基础的 CPU profile 讲起,一路带你走过火焰图、堆分析、Goroutine dump、GODEBUG 调优,最终用一个完整电商订单服务的案例把全流程串起来。
## 一、为什么 Go 服务必须会 pprof
Go 的运行时自带 SIGPROF 信号采样(Linux 100Hz),几乎零开销地把"程序在哪些代码上花了时间"以 protobuf 编码写进 `.pb.gz` 文件,再由 `go tool pprof` 读取并展示为调用栈 + 扁平 / 累计占比。它和 Node.js 的 `--prof`、Java 的 async-profiler 思路一致,但 Go 的优势在于:**无需额外 Agent,二进制内置**。
下图是 Go 性能剖析的完整链路,从信号采集到最终优化决策五个步骤: