能,pprof火焰图可直接暴露CPU或内存热点,但需正确选择profile类型(如/cpu、/heap、/allocs)并确保程序在真实负载下运行,否则采样无效。
能,但必须跑对 profile 类型,且程序得真实负载运行。默认 go tool pprof 读的是 CPU profile(net/http/pprof 下的 /debug/pprof/profile),它采样的是正在执行的 goroutine 栈帧,反映「CPU 时间花在哪」;而内存瓶颈要看 /debug/pprof/heap(分配峰值)或 /debug/pprof/allocs(累计分配)。火焰图本身不区分,关键看数据源。
profile 几乎全是 runtime 系统调用,火焰图没意义curl http://localhost:8080/api),再抓 profile,否则采不到业务逻辑栈net/http/pprof,需显式导入:import _ "net/http/pprof",且路由必须注册 http.DefaultServeMux 或手动挂载最常见原因是采样时间太短或程序没在工作。pprof CPU profile 默认采样 30 秒,但若程序在这期间大部分时间阻塞(如等 I/O、channel、sleep),采样器就抓不到活跃栈。
go tool pprof -seconds=5 http://localhost:8080/debug/pprof/profile 缩短采样时间,配合压测工具(如 ab -n 100 -c 10 http://localhost:8080/)确保有并发请求127.0.0.1:8080,但你在容器外 curl 容器内地址,会超时;用 curl -v http://localhost:8080/debug/pprof/ 先验证 pprof 页面是否返回 HTML这不是 bug,而是 Go 调度器正常行为,但密集出现说明 goroutine 频繁让出或阻塞。重点看这些系统调用「上面是谁调的」——火焰图从下往上读,顶部是叶子函数,底部是入口。
runtime.gopark 上面紧挨着 io.ReadFull 或 net.Conn.Read,说明卡在 I/O;换成带 timeout 的 conn.SetReadDeadline 或改用非阻塞 channelruntime.mcall 上面是 sync.(*Mutex).Lock,且路径深、宽度大,大概率是锁竞争 —— 检查是否在 hot path 上反复 Lock/Unlock 同一把 mutex用 go tool pprof 的 -http 参数启动本地服务只是临时预览,真正分享需要静态 HTML。核心命令是:
立即学习“go语言免费学习笔记(深入)”;
go tool pprof -http=localhost:8081 -svg your_binary cpu.pprof
但更可靠的做法是生成独立文件:
wget http://localhost:8080/debug/pprof/profile?seconds=10 -O cpu.pprof
go tool pprof -svg cpu.pprof > flame.svg(注意不是所有终端支持 SVG 渲染,建议用浏览器打开)go tool pprof -weblist cpu.pprof 输出文本列表;真正要 HTML 可视化,得用 go tool pprof -http=:8081 cpu.pprof,然后访问 http://localhost:8081/ui,点击右上角「Download」按钮导出 flamegraph.html
.pprof 文件给别人 —— 它依赖二进制符号表,对方没有你的 your_binary 就打不开;导出 HTML 或 SVG 才真正自包含火焰图宽高比和折叠逻辑很敏感,同一份 profile 在不同 pprof 版本下渲染可能略有差异,生产环境排查务必用和编译二进制一致的 Go 版本生成图。