這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
以下所有觀點都是個人愚見,有不同建議或補充的的歡迎emial, aboutme
原文章地址
pprof的簡介
pprof是golang標準庫裡面的其中一個庫,它通過其HTTP伺服器得到運行時的分析資料,從而給pprof視覺化檢視提供資料分析來源。它可以用來分析效能消耗,分析記憶體流失,死結等。
具體使用可以瞭解官方包pprof,那我如何在http中使用pprof?如何在已有http或者https服務上使用pprof呢?這些答案在標準庫找不到,隨在此記錄一下。
如何啟動pprof
在官方包中已經給出了例子:
package mainimport "net/http"import _ "net/http/pprof" // 初始化pproffunc 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 mainimport ("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/heapFetching profile over HTTP from http://localhost:6060/debug/pprof/heaphttp://localhost:6060/debug/pprof/heap: server response: 404 Not Foundfailed to fetch any source profiles
為什麼程式匯入了_ "net/http/pprof"
還是會404呢?因為匯入pprof的時侯只是調用了pprof包的init
函數,看看init裡面的內容,pprof.init(),可以得知,這裡註冊的所有路由都是在DefaultServeMux
下的,所以當然我們自訂的mux是沒有用的,要使它有用也很簡單,我們自己手動註冊路由與相應的處理函數。
package mainimport ("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
Please enable JavaScript to view the comments powered by Disqus.comments powered by Disqus