Go 自带 pprof 工具链,通过导入 net/http/pprof 即可启用 HTTP 分析端点;CPU profile 需至少采样 30 秒,heap profile 默认返回分配总量而非驻留内存,应使用 -inuse_space 查看真实内存占用;goroutine 和 block profile 需配合 debug 参数与采样率设置来定位阻塞与泄漏。
Go 自带的 pprof 工具链足够强大,不需要额外安装第三方工具——只要用的是标准 Go 安装包(1.0+),go tool pprof 就已就位。
如何启用 HTTP 服务暴露 pprof 接口
最常用方式是通过 net/http/pprof 在运行时暴露分析端点。它不依赖外部服务,只需几行代码注入已有 HTTP server:
- 导入
net/http/pprof(注意:仅导入即可注册路由,无需显式调用) - 确保你的服务有
http.ServeMux或使用默认 mux,并监听如:6060这类非业务端口 - 无需手动注册
/debug/pprof/,导入后自动生效
示例片段:
import (
_ "net/http/pprof"
"net/http"
)
func main() {
go func() {
http.ListenAndServe(":6060", nil) // 启动独立 debug 端口
}()
// ... 主业务逻辑
}
常见错误:把 pprof 路由注册到自定义 http.ServeMux 却忘了导入 net/http/pprof,结果访问 /debug/pprof/ 返回 404。
如何用 go tool pprof 分析 CPU 和内存数据
go tool pprof 是核心命令行工具,支持从实时服务或离线 profile 文件加载数据。关键区别在于采集方式和参数:
- CPU profile:默认采样 100Hz,需持续请求至少 30 秒才容易捕获有效热点,命令为
go tool pprof http://localhost:6060/debug/pprof/profile - Heap profile:抓当前内存分配快照,用
go tool pprof http://localhost:6060/debug/pprof/heap - 避免直接用
-http启 GUI(如-http=:8080),本地开发建议先用top或list查看函数耗时,再针对性展开
注意:profile 默认只采集 30 秒,若服务流量低或逻辑执行快,可能采不到有效样本——可加 ?seconds=60 手动延长,例如:http://localhost:6060/debug/pprof/profile?seconds=60。