以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial, aboutme
原文章地址
pprof的简介
pprof是golang标准库里面的其中一个库,它通过其HTTP服务器得到运行时的分析数据,从而给pprof可视化工具提供数据分析来源。它可以用来分析性能消耗,分析内存泄漏,死锁等。
具体使用可以了解官方包pprof,那我如何在http中使用pprof?如何在已有http或者https服务上使用pprof呢?
这些答案在标准库找不到,随在此记录一下。
如何启动pprof
在官方包中已经给出了例子:
package main
import "net/http"
import _ "net/http/pprof" // 初始化pprof
func main() {
// do something
...
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil)) //启动http服务器
}()
}
启动完后,就可以使用go自动的工具go tool pprof
如:
go tool pprof http://localhost:6060/debug/pprof/heap // 获取堆的相关数据
go tool pprof http://localhost:6060/debug/pprof/profile // 获取30s内cpu的相关数据
go tool pprof http://localhost:6060/debug/pprof/block // 在你程序调用 runtime.SetBlockProfileRate ,查看goroutine阻塞的相关数据
go tool pprof http://localhost:6060/debug/pprof/mutex // 在你程序调用 runtime.SetMutexProfileFraction,查看谁占用mutex
为什么我自定义mux的http服务不能用?
启动自定义mux的http服务器
package main
import (
"net/http"
_ "net/http/pprof"
)
func main() {
// 启动一个自定义mux的http服务器
mux := http.NewServeMux()
mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello"))
})
http.ListenAndServe(":6060", mux)
}
得到结果: 404 Not Found
go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
http://localhost:6060/debug/pprof/heap: server response: 404 Not Found
failed to fetch any source profiles
为什么程序导入了_ "net/http/pprof"
还是会404呢?因为导入pprof的时侯只是调用了pprof包的init
函数,看看init里面的内容,pprof.init(),可以得知,这里注册的所有路由都是在DefaultServeMux
下的,
所以当然我们自定义的mux是没有用的,要使它有用也很简单,我们自己手动注册路由与相应的处理函数。
package main
import (
"net/http"
"net/http/pprof"
)
func main() {
// 启动一个自定义mux的http服务器
mux := http.NewServeMux()
mux.HandleFunc("/debug/pprof/", pprof.Index)
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello"))
})
http.ListenAndServe(":6066", mux)
}
这样,线上的服务出现问题时,就可以用pprof工具看看,是否有异常。
pprof如何在https中使用?
go tool pprof https+insecure://localhost:8001/debug/pprof/heap
将原来的http
替换成https+insecure
即可。
注意:go的版本要>=go1.8,具体查看go1.8的release信息https://tip.golang.org/doc/go1.8#tool_pprof