526 字
3 分钟
Go语言下的pprof

对于go语言的pprf分析我们有两种情况,一个是针对长期开启的服务进行探测,还有一种是针对脚本进行分析

针对服务型#

我们可以在代码中使用 net/http/pprof 包。你只需要在代码中匿名引入,它会自动在 8080(或其他你定义的)端口开启一个 /debug/pprof 路由。

// 在main函数中启动
go func() {
http.ListenAndServe("localhost:6060", nil)
}()

这样go会在6060端口下打开一个网页(虽然很简陋),访问http://localhost:6060/debug/pprof/就可以看到这样一个的分析

alt text

脚本#

对于脚本和一些简单go程序,会运行一段时间直接退出,这个时候就不适合打开端口监控了,我们可以直接在脚本中插入埋点

package main
import (
"os"
"runtime/pprof"
"runtime"
"log"
)
func main() {
// --- CPU Profile ---
cpuFile, err := os.Create("cpu.prof")
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(cpuFile)
defer pprof.StopCPUProfile()
// 运行你的脚本逻辑
runScriptLogic()
// --- Memory Profile ---
memFile, err := os.Create("mem.prof")
if err != nil {
log.Fatal(err)
}
defer memFile.Close()
// 显式运行一次 GC,确保内存数据准确
runtime.GC()
if err := pprof.WriteHeapProfile(memFile); err != nil {
log.Fatal(err)
}
}
func runScriptLogic() {
// 模拟耗时或内存密集操作
sum := 0
for i := 0; i < 1000000; i++ {
sum += i
}
}

这个时候我们运行结束后会发现目录下多了cpu.prof 和 mem.prof 文件,我们使用pprf就可以进行分析:

Terminal window
go tool pprof cpu.prof

更推荐的测试方法#

如果我们需要测试的内容可以封装为一个函数,那么使用 Go 的测试工具链进行性能分析是最简单、最专业的做法, 不需要在业务代码里写任何 pprof 代码

我们需要编写一个benchmark文件

package main
import "testing"
func BenchmarkMyTask(b *testing.B) {
for i := 0; i < b.N; i++ {
runScriptLogic() // 调用你要分析的函数
}
}

然后通过 test 工具链对整个程序进行测试并生成分析

Terminal window
go test -bench . -cpuprofile cpu.prof -memprofile mem.prof

最后通过pprf进行分析

Terminal window
go tool pprof -http=:8080 cpu.prof // 在8080端口打开网页,需要安装Graphviz
Go语言下的pprof
https://blog.imicola.com/posts/go语言下的pprof/
作者
imicola
发布于
2026-02-06
许可协议
CC BY 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 257 天

部分内容可能已过时