pprof无需额外安装,Go 1.0起已内置;需验证go tool pprof -h可用且runtime/pprof路径存在,Alpine等精简镜像除外;HTTP端点必须显式注册/debug/pprof/(含末尾斜杠),Gin等框架须手动挂载;CPU、heap、goroutine等采样URL不可混用,查泄漏需加?gc=1,火焰图缺失函数名因未提供原始二进制或编译时strip了符号表;生产环境务必限制/debug/pprof访问权限。

pprof 不需要额外安装,但必须确认 go tool 可用
Go 1.0 起就自带 go tool pprof,不是第三方工具,go get 安装纯属多余,还可能引入版本冲突。验证方式很简单:go tool pprof -h 能打印帮助说明就绪;go list -f '{{.Dir}}' runtime/pprof 能输出路径说明标准库完整。
常见例外:Alpine Linux 或极简容器镜像(如 golang:alpine)通常不含 go tool pprof,得换用 golang:slim 或手动复制二进制;Windows 用户若 PowerShell 报“找不到命令”,大概率是 GOBIN 没加进 PATH,不是 pprof 缺失。
HTTP 服务必须显式挂载 /debug/pprof/,且路径末尾斜杠不能少
import _ "net/http/pprof" 只对 http.DefaultServeMux 生效。如果你用了 http.NewServeMux()、Gin、Echo 等框架,它不会自动注册任何路由——访问 /debug/pprof/ 直接 404。
- 自定义 mux 时,必须手动挂载:
router.HandleFunc("/debug/pprof/", http.HandlerFunc(pprof.Index))router.Handle("/debug/pprof/profile", http.HandlerFunc(pprof.Profile))router.Handle("/debug/pprof/heap", http.HandlerFunc(pprof.Heap)) - 路径末尾的
/极其关键:/debug/pprof/和/debug/pprof是两个不同路由,漏掉会导致子页面(如/debug/pprof/goroutine?debug=2)全部 404 - Gin 用户别写
gin.Default().GET("/debug/pprof/*pprof", ...)—— Gin 的通配符不兼容 pprof 内部重定向逻辑,应改用gin.WrapH(http.DefaultServeMux)
CPU 和 heap profile 容易混淆,选错 URL 就白采样
不同 URL 对应完全不同的采样逻辑,混用会得出错误结论:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
立即学习“go语言免费学习笔记(深入)”;
- CPU 高?用
http://host:6060/debug/pprof/profile(默认 30 秒),它采样的是「正在执行的 goroutine 栈帧」,反映真实耗时热点 - 内存持续上涨?优先看
http://host:6060/debug/pprof/heap,但注意:默认返回的是「分配总量」,不是当前存活对象;查泄漏必须加?gc=1获取 GC 后的存活堆快照 - goroutine 数量疯长?直接访问
http://host:6060/debug/pprof/goroutine?debug=2,文本格式可读性强,一眼识别卡在select、chan recv或锁上的 goroutine - block/mutex 数据默认为空:必须提前在代码里加
runtime.SetBlockProfileRate(1)和runtime.SetMutexProfileFraction(1),否则/debug/pprof/block和/debug/pprof/mutex返回空
火焰图看不到函数名?缺原始二进制文件或没关 strip
这是最常踩的坑:火焰图里全是 runtime.xxx 或地址(如 0x456789),业务函数名全丢失。
原因只有两个:
- 分析时没提供原始编译出的二进制文件:
go tool pprof binary http://host:6060/debug/pprof/profile,不能只传 URL - 编译时用了
-ldflags="-s -w"去符号表,导致函数名被 strip。生产环境可 strip,但做性能分析前务必保留符号信息
另外,生产环境暴露 /debug/pprof/ 有严重风险,必须限制访问来源(如绑定 127.0.0.1:6060 或加反向代理鉴权),它泄露 goroutine 栈、heap 分布甚至符号表。


















