go tool pprof -svg 命令需依赖 graphviz 的 dot 工具生成调用图,必须先安装并配置好 dot 到系统 path;若要生成火焰图则需使用 -http 模式后点击网页中的“flame graph”标签。

Go 的 pprof 怎么导出 SVG 图形(不是文本)
pprof 本身不直接生成 SVG,必须借助 dot 命令(Graphviz 的核心工具)完成渲染。没装 Graphviz,go tool pprof -svg 会卡住或报错 failed to execute dot: exec: "dot": executable file not found in $PATH。
- 先确认
dot是否可用:dot -V,输出类似dot - graphviz version 7.0.5 (20230918.0000)才算到位 - Mac 用户用 Homebrew 安装最稳:
brew install graphviz;Windows 推荐去官网下载安装包(选带dot.exe的完整版),别用 Chocolatey 的精简版——它常缺dot - Linux(如 Ubuntu)要装两个包:
sudo apt install graphviz graphviz-dev,只装graphviz可能导致 pprof 渲染时静默失败 -
go tool pprof -svg生成的是调用图(callgraph),不是火焰图;想看火焰图得用go tool pprof -http=启服务后点网页上的 “Flame Graph” 标签
为什么 pprof -svg 输出空白或只有节点没连线
本质是 Go 程序没采集到足够调用栈信息,或者采样太浅。SVG 图依赖函数间调用关系,而默认的 CPU profile 采样频率(100Hz)在短生命周期程序里容易漏掉关键路径。
- 确保程序运行时间 >5 秒,且有真实 CPU 消耗(比如加个
time.Sleep(6 * time.Second)配合runtime/pprof.StartCPUProfile) - 避免用
go run main.go直接跑:编译成二进制再跑更可靠,go build -o app && ./app - profile 文件必须是 CPU 类型(
cpu.pprof),内存 profile(mem.pprof)用-svg会生成无意义的分配图,连线稀疏甚至全断 - 如果用了
pprof.Lookup("goroutine").WriteTo(...)这类手动 dump,它不支持-svg渲染,只能用-text或-web
Graphviz 安装后 dot 命令仍找不到怎么办
不是安装失败,而是 PATH 没生效,尤其常见于 zsh、fish shell 或 Windows 的新终端窗口。
- Mac:Homebrew 默认装在
/opt/homebrew/bin/dot(Apple Silicon)或/usr/local/bin/dot(Intel),检查echo $PATH是否含对应路径;没含就加到~/.zshrc末尾:export PATH="/opt/homebrew/bin:$PATH",然后source ~/.zshrc - Windows:安装 Graphviz 时勾选 “Add Graphviz to the system PATH for all users”,若已装完,手动把
C:\Program Files\Graphviz\bin(或类似路径)加进系统环境变量 PATH - 验证方式统一:新开一个终端,直接输
which dot(Mac/Linux)或where dot(Windows),有输出才算真正就位
pprof + Graphviz 生成的 SVG 太大打不开
默认渲染会把所有调用路径展开,函数多、递归深时 SVG 节点超万级,浏览器直接卡死或崩溃。
立即学习“go语言免费学习笔记(深入)”;
- 加过滤参数压图规模:
go tool pprof -svg -focus=MyHandler -ignore=runtime,-focus锁定入口,-ignore屏蔽标准库噪音 - 限制深度:
go tool pprof -svg -nodecount=50,只保留 top 50 节点,其余合并为 “others” - 导出前先用
top看热点函数:go tool pprof cpu.pprof && (pprof) top10,确认聚焦目标再渲染,避免盲目生成 - 生成后别双击打开,用 VS Code 插件 “SVG Viewer” 或浏览器拖入查看,比直接双击系统默认程序更稳
真正麻烦的不是装 Graphviz,而是 profile 数据质量——采样时机、程序运行时长、是否被 GC 干扰,这些比 dot 命令是否存在更容易让 SVG 变成一张废图。











