go性能工具pprof

Go 语言自带的 pprof 库就可以分析程序的运行情况,并且提供可视化的功能。它包含两个相关的库:

  1. runtime/pprof
    对于只跑一次的程序,例如每天只跑一次的离线预处理程序,调用 pprof 包提供的函数,手动开启性能数据采集。

  2. net/http/pprof
    对于在线服务,对于一个 HTTP Server,访问 pprof 提供的 HTTP 接口,获得性能数据。当然,实际上这里底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问。

因为自己用gin比较多,所以使用github.com/gin-contrib/pprof,其实内部也就是上面两个库。使用非常简单。

var debugHttp *http.Server

func runPPROF() {
	g := gin.New()
	g.Use(gin.Recovery())
	g.Use(gin.Logger())

	pprof.Register(g)

    // 使用9000端口开启http服务
	debugHttp = &http.Server{
		Addr:    ":9000",
		Handler: g,
	}
	debugHttp.ListenAndServe()
}

开启之后可以web访问 http://127.0.0.1:9000/debug/pprof/可以查看实时数据,
pprof

当然也可以查看某个时间段的性能情况:

// 监听60s性能情况,默认进入命令行
go tool pprof http://127.0.0.1:9000/debug/pprof/profile\?seconds\=60

pprof

// 本地启动http服务查看,需要装graphviz插件
go tool pprof -http=:8080  ~/pprof/pprof.go.samples.cpu.032.pb.gz

pprof

可以切换看占用最高的,还有火焰图等等,相当好用,一般性能瓶颈就在占用比较多的。

PS: 有时候线上可能没有开启,也可以使用perf去debug查看占用资源比较多的。

// 19323 端口号
perf record -p 19323
perf report

参考:


go性能工具pprof
https://blog.puresai.com/2022/01/29/385/
作者
puresai
许可协议