pprof 功能有两种开启方式,对应两种包:
net/http/pprof
:使用在 web 服务器的场景runtime/pprof
:使用在非服务器应用程序的场景这两个本质上是一致的,net/http/pporf
也只是在 runtime/pprof
上的一层 web 封装,通过程序的HTTP运行时提供服务,使用pprof可视化工具性能分析数据并提供期望的输出格式。
只要导入这个包来注册它的HTTP处理程序就可以了,处理路径都是以/debug/pprof/
开头的。要使用pprof
主要在程序中导入import _ "net/http/pprof"
如果应用程序不启动http服务器,那么需要导入net/http
和log
包,如下所示:
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
如果不使用DefaultServeMux
,那么在路由器上注册使用的处理程序即可。
这种通常用于程序调优的场景,程序只是一个应用程序,跑一次就结束,想找到瓶颈点,那么通常会使用到这个方式。
// cpu pprof 文件路径
f, err := os.Create("cpufile.pprof")
if err != nil {
log.Fatal(err)
}
// 开启 cpu pprof
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
查看所有可用的概要信息,在浏览器其中打开http://localhost:6060/debug/pprof/
,这里的端口根据实际运行情况确定。
案例 | 调用 |
---|---|
查看堆信息 | go tool pprof http://localhost:6060/debug/pprof/heap |
查看30秒内CPU信息 | go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 |
查看goroutine 的阻塞信息(在程序中调用runtime.SetBlockProfileRate ) | go tool pprof http://localhost:6060/debug/pprof/block |
手收集5秒内执行的跟踪信息 | wget http://localhost:6060/debug/pprof/trace?seconds=5 |
查看锁的持有者(在程序中调用runtime.SetMutexProfileFraction ) | go tool pprof http://localhost:6060/debug/pprof/mutex |
了解更多,可查看golang官方博客的文章,点击这里。