golang在自訂的https伺服器中啟用pprof介面

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

以下所有觀點都是個人愚見,有不同建議或補充的的歡迎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

  • ← Previous Post
Please enable JavaScript to view the comments powered by Disqus.comments powered by Disqus
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.