Go自带pprof不直接生成火焰图SVG,需用go tool pprof -http=:8080 cpu.pprof启动Web界面,访问https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e查看交互式火焰图;若需离线SVG则用-svg参数,但该图不支持搜索缩放。

怎么用 pprof 生成火焰图数据
Go 自带的 pprof 是唯一需要的工具,不需要额外安装火焰图绘制器。关键不是“画图”,而是先拿到能反映真实执行路径的采样数据。
- 必须用
net/http/pprof或runtime/pprof启用 CPU 采样,仅靠go build编译不出 profile 数据 - CPU profile 要运行足够长时间(建议 ≥30 秒),否则采样点太少,火焰图会稀疏失真
- 不要直接在本地开发机上跑高负载压测:系统噪声(如后台更新、GUI 动画)会污染采样结果
- 如果程序是短生命周期命令行工具,用
runtime/pprof.StartCPUProfile手动控制启停更可靠
例如,在 HTTP 服务中启用:
import _ "net/http/pprof"
<p>func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// ... your app logic
}然后用 go tool pprof <a href="https://www.php.cn/link/e0652a0045dbc0b14d016619158789ce">https://www.php.cn/link/e0652a0045dbc0b14d016619158789ce</a> 抓取 30 秒 CPU 数据。
为什么火焰图里看不到自己的函数名
最常见原因是编译时优化干扰了符号信息,或者 profile 数据没包含调用栈上下文。
立即学习“go语言免费学习笔记(深入)”;
- 默认
go build会开启-gcflags="-l"(禁用内联)和-ldflags="-s -w"(剥离符号),这两项必须禁掉 - 正确编译命令:
go build -gcflags="" -ldflags="" -o myapp ./main.go - 如果用了 cgo,确保
CGO_ENABLED=1,否则部分系统调用栈可能截断 - 某些 goroutine 处于休眠或 syscall 状态时不会被 CPU profile 捕获——这时应改用
pprof/profile?mode=trace或结合goroutineprofile 分析阻塞点
火焰图顶部显示的是采样时正在执行的函数,如果全是 runtime.futex 或 syscall.Syscall,大概率是 I/O 阻塞,不是 CPU 瓶颈。
怎么把 pprof 数据转成可交互火焰图
pprof 本身不生成 SVG,但内置了 Web 可视化界面,比第三方脚本更准、更省事。
- 运行
go tool pprof -http=":8080" cpu.pprof,浏览器打开<a href="https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e">https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e</a>即可看到交互式火焰图 - 点击任意函数框可下钻查看其调用者 / 被调用者,右上角切换 “Flame Graph”、“Top”、“Source” 视图
- 不要用
flamegraph.pl脚本二次转换:它依赖pprof的文本输出,而 Go 的 symbol resolution 在文本模式下容易丢失泛型实例或闭包名 - 如果需离线 SVG,用
go tool pprof -svg cpu.pprof > flame.svg,但注意该 SVG 不支持搜索和缩放交互
火焰图宽度 = 该函数及其子调用占总采样时间的比例,不是绝对耗时;窄条不等于不重要——比如一个高频小函数被调用百万次,可能比单次长耗时函数更值得优化。
goroutine 泄漏或锁竞争能用火焰图看出来吗
不能直接看,但可以辅助定位。火焰图本质是 CPU 时间分布,goroutine 泄漏是数量问题,锁竞争是同步等待问题。
-
goroutineprofile(/debug/pprof/goroutine?debug=2)输出的是当前存活 goroutine 的堆栈快照,适合查泄漏,但火焰图无法体现“数量膨胀”趋势 -
mutexprofile(/debug/pprof/mutex?seconds=30)能标出争用最久的锁,但火焰图只显示“谁在等锁”,不显示“为什么等”——得配合go tool pprof -top查具体锁持有者 - 真正要确认锁竞争,优先看
go tool pprof mutex.pprof的 top 列表,再点进火焰图看调用上下文
别指望一张图解决所有性能问题。CPU 火焰图只是起点,后续大概率要切到 trace、heap、block 等其他 profile 类型交叉验证。
实际调试中最容易忽略的,是没关掉日志打印或调试 hook——它们会让火焰图顶部堆满 fmt.Sprintf 和 runtime.growslice,掩盖真正的业务热点。



















