go pprof
目录pprof 是什么一、核心功能二、如何使用 pprof2.1 引入包并启动 HTTP 端点最常用2.2 常用剖析端点三、分析 pprof 数据三种方式3.1 命令行交互式分析go tool pprof3.2 Web UI更直观3.3 直接生成图形文件四、实际场景示例4.1 定位 CPU 热点4.2 定位内存分配热点4.3 对比两个时间点的内存差异五、常用选项与参数六、与其他工具的关系七、与 GODEBUG 的区别八、生产环境使用建议pprof是什么pprof是 Go 语言内置的性能剖析工具用于分析 Go 程序的CPU 使用、内存分配、goroutine 阻塞、锁竞争、线程创建等性能瓶颈。它是 Go 性能调优的核心工具之一名字来源于 Google 的Perf Profiler。一、核心功能pprof可以回答以下问题问题对应剖析类型哪个函数消耗 CPU 最多CPU profiling哪个函数分配内存最多Memory profiling堆内存哪个 goroutine 阻塞最久Block profiling同步阻塞哪把锁竞争最激烈Mutex profiling锁竞争当前有多少 goroutine它们阻塞在哪Goroutine profiling谁创建了大量 OS 线程ThreadCreate profiling二、如何使用pprof2.1 引入包并启动 HTTP 端点最常用import _ net/http/pprof func main() { go func() { log.Println(http.ListenAndServe(localhost:6060, nil)) }() // 业务代码... }访问http://localhost:6060/debug/pprof/可以看到所有可用的剖析端点。2.2 常用剖析端点端点作用采样内容/debug/pprof/profile?seconds30CPU 剖析CPU 使用率持续采样 30 秒/debug/pprof/heap堆内存剖析当前存活对象的内存分配/debug/pprof/allocs所有内存分配从程序启动到现在的所有分配包括已被 GC 的/debug/pprof/goroutinegoroutine 堆栈当前所有 goroutine 的调用栈/debug/pprof/block阻塞剖析goroutine 阻塞在同步操作上的时间/debug/pprof/mutex锁竞争剖析互斥锁的竞争情况/debug/pprof/threadcreate线程创建创建新 OS 线程的堆栈三、分析pprof数据三种方式3.1 命令行交互式分析go tool pprof# 采集 CPU 剖析采样 30 秒后进入交互界面 go tool pprof http://localhost:6060/debug/pprof/profile?seconds30 # 直接分析已保存的文件 go tool pprof cpu.pprof常用交互命令命令作用top按资源消耗排序显示函数top10显示前 10 个最耗资源的函数list 函数名显示该函数的源码逐行分析开销web生成调用关系火焰图需要安装 Graphvizpdf生成 PDF 格式的调用图traces显示完整的调用堆栈help查看所有命令3.2 Web UI更直观# 启动 Web UIGo 1.21 推荐 go tool pprof -http:8080 cpu.pprof浏览器打开http://localhost:8080可以看到Graph调用关系有向图箭头越粗表示开销越大Flame Graph火焰图Top表格式排序Source源码视图每行代码的开销标注3.3 直接生成图形文件go tool pprof -pdf cpu.pprof cpu.pdfgo tool pprof -svg cpu.pprof cpu.svg四、实际场景示例4.1定位 CPU 热点# 采样 30 秒 go tool pprof http://localhost:6060/debug/pprof/profile?seconds30 (pprof) top10Showing nodes accounting for 3.5s, 87.50% of 4s total flat flat% sum% cum cum% 1.2s 30.00% 30.00% 1.5s 37.50% encoding/json.(*decodeState).object 0.8s 20.00% 50.00% 0.8s 20.00%runtime.scanobjectflat函数自身的耗时不含调用的子函数cum累计耗时含调用的子函数4.2 定位内存分配热点go tool pprof http://localhost:6060/debug/pprof/heap (pprof) top (pprof) list 可疑函数4.3 对比两个时间点的内存差异# 采样两次 curl -o heap1.pprof http://localhost:6060/debug/pprof/heap # 过一段时间... curl -o heap2.pprof http://localhost:6060/debug/pprof/heap # 对比差异显示增加的部分 go tool pprof -base heap1.pprof heap2.pprof五、常用选项与参数参数作用-seconds30CPU 剖析采样时长默认 30 秒-base对比两个剖析文件用于内存泄漏检测-http:8080启动 Web UI-list 函数名显示函数源码及每行开销-top显示前 N 个消耗点-svg生成 SVG 格式图形-pdf生成 PDF 格式图形-png生成 PNG 格式图形-cum按累计cum排序默认按 flat六、与其他工具的关系工具用途与 pprof 的关系go test -bench . -cpuprofile cpu.out基准测试时生成剖析文件可直接用go tool pprof分析runtime/pprof包代码中直接控制剖析的开始/结束适用于一次性任务、批处理net/http/pprof包提供 HTTP 端点动态采集适用于长期运行的服务trace完整执行追踪GC、goroutine 调度等互补工具pprof 看统计trace 看时序七、与GODEBUG的区别维度GODEBUGpprof输出形式文本日志stderr二进制文件 可视化图形分析维度侧重运行时行为GC、调度器函数级 CPU/内存/阻塞/锁使用场景快速排查 GC 问题、调度问题深入定位性能瓶颈、内存泄漏数据聚合逐行实时输出采样聚合可离线分析两者配合使用效果最佳先用GODEBUGgctrace1判断是否是 GC 问题再用pprof定位具体热点函数。八、生产环境使用建议✅安全pprof不会改变程序行为可以放心在生产环境开启。✅按需开启通过环境变量或配置开关控制采样端口的开放避免暴露公网。✅短时采样CPU 剖析建议采样 30-60 秒长期开启会有性能开销。⚠️内存剖析开销小可以长期开启不过每次读取时会触发 GC高版本已优化。❌避免暴露公网pprof端口不应暴露在公网上可能泄露敏感信息。