go tool pprof 无法直接生成火焰图 SVG,需先用 -raw -lines 导出 folded stack 文本,再用 flamegraph.pl 渲染;Web UI 的「Flame graph」依赖 dot 工具且易因环境缺失失败,命令行方式最稳定可靠。

Go 自带的 go tool pprof 不会直接生成火焰图 SVG,必须经过两步:先用它导出折叠栈(folded stack)文本,再交给 flamegraph.pl 渲染;或者启用 Web UI 后手动点「Flame graph」标签——但后者强依赖本地 dot 工具,且容易因环境缺失静默失败。
pprof 命令行导出 folded stack 是最稳的方式
Web UI 的「Flame graph」按钮看似方便,实际常因没装 Graphviz、dot 不在 PATH、或 profile 过大卡死而白屏。命令行路径更可控:
-
go tool pprof -raw -lines http://localhost:6060/debug/pprof/profile?seconds=10输出原始采样数据,加-raw才能被flamegraph.pl识别 - 输出重定向到文件:
go tool pprof -raw -lines http://localhost:6060/debug/pprof/profile?seconds=10 > stacks.txt - 用官方 Perl 脚本转换:
./flamegraph.pl stacks.txt > flame.svg(脚本需从 Brendan Gregg 仓库 下载) - 别用
-svg参数——它调的是dot,画的是调用图(callgraph),不是火焰图(flame graph)
Web UI 点「Flame graph」前必须确认 dot 可用
很多人执行 go tool pprof -http=:8080 cpu.pprof 后点按钮没反应,根本原因是 dot 缺失或版本太老:
- macOS:运行
brew install graphviz,然后dot -V确认输出版本号 - Linux(Debian/Ubuntu):
sudo apt install graphviz - Windows:从 graphviz.org 下载 MSI,安装时勾选「Add Graphviz to the system PATH」
- 如果
dot在非标准路径(如C:\Program Files\Graphviz\bin\dot.exe),需设环境变量:PPROF_BINARY_PATH=C:\Program Files\Graphviz\bin
采样时长和符号缺失是火焰图“看不懂”的主因
火焰图里函数名全是 ? 或 [unknown],或者底部宽、顶部窄看不出业务逻辑,基本就这两类问题:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
立即学习“go语言免费学习笔记(深入)”;
- 编译时用了
-ldflags="-s"去掉了符号表 → 重新编译,去掉该参数 - 采样时间太短(如默认 30 秒)导致热点没稳定出现 → 对高 QPS 服务,改用
?seconds=5或?seconds=10;对长周期任务,可拉长到 60 秒,但别超 120 秒 - 程序生命周期短(CLI 工具),HTTP 接口来不及抓 → 改用代码内嵌:
pprof.StartCPUProfile+defer pprof.StopCPUProfile()写文件 - 火焰图底部大量
runtime.mcall、syscall.Syscall→ 不是 pprof 问题,说明瓶颈在系统调用或锁竞争,该查http.Client.Timeout、context.WithTimeout或用go tool pprof -mutex
线上环境千万别直接暴露 /debug/pprof
HTTP 接口不校验权限,/debug/pprof/profile 被扫到等于把性能底牌交出去:
- 开发机可绑
127.0.0.1:6060,线上务必绑定localhost:6060并通过 SSH 端口转发调试 - 生产环境建议移除
import _ "net/http/pprof",改用本地分析:程序运行时用curl -o cpu.pprof 'http://localhost:6060/debug/pprof/profile?seconds=10'拉取文件,再离线跑go tool pprof - 若必须在线分析,Nginx 层加 IP 白名单,或用反向代理限制
/debug/pprof/.*路径
火焰图不是万能的——它只反映 CPU 时间分布,对 I/O 阻塞、GC 压力、锁竞争等场景,得配合 go tool pprof -mutex、runtime/trace 或 heap profile 对比才能闭环。真正难的从来不是生成那张图,而是看懂图里哪一层该信、哪一层是噪音。


















