首頁  >  文章  >  後端開發  >  完全掌握Go的pprof使用法

完全掌握Go的pprof使用法

尚
轉載
2019-11-25 13:41:214226瀏覽

完全掌握Go的pprof使用法

go中有pprof套件來做程式碼的效能監控,兩個地方有套件:

net/http/pprof

runtime/pprof

其實net/http/pprof中只是使用runtime/pprof套件來進行封裝了一下,並在http埠上暴露出來

pprof套件

web 伺服器

如果你的go程式是用http套件啟動的web伺服器,你想查看自己的web伺服器的狀態。這時候就可以選擇net/http/pprof。你只需要引入套件_"net/http/pprof"。

接著就可以在瀏覽器中使用http://localhost:port/debug/pprof/直接看到目前web服務的狀態,包括CPU佔用情況和記憶體使用情況等。具體使用情況你可以看godoc的說明。

服務進程

如果你的go程式不是web伺服器,而是服務進程,那麼你也可以選擇使用net/http/pprof套件,同樣地引入套件net/http/pprof,然後在開啟另外一個goroutine來開啟連接埠監聽。

例如:

go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil)) 
}()

應用程式

如果你的go程式只是一個應用程序,例如計算fabonacci數列,那麼你就不能使用net /http/pprof套件了,你就需要使用到runtime/pprof。具體做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。例如下面的範例:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }
…

執行程式的時候加一個--cpuprofile參數,例如fabonacci --cpuprofile=fabonacci.prof

這樣程式執行的時候的cpu資訊就會記錄到XXX.prof中了。

下一步就可以使用這個prof資訊做出效能分析圖了(需要安裝graphviz)。

使用go tool pprof (應用程式) (應用程式的prof檔案)

#進入到pprof,使用web指令就會在/tmp下產生svg文件,svg檔案是可以在瀏覽器下看的。像這個樣子:

完全掌握Go的pprof使用法

如果你的程式非常簡單,例如只有println一個語句,你用pprof.StartCPUProfile是印不出任何東西的。

舉例

下面拿go-tour舉個例子,這是個web程序,我在程式碼中加入了

_ "net/http /pprof"

在瀏覽器中我就可以直接看prof資訊了

完全掌握Go的pprof使用法

產生CPU狀態分析圖

完全掌握Go的pprof使用法

############### ###下面我們想要產生CPU狀態分析圖,呼叫go tool pprof http://localhost:3999/debug/pprof/profile######就會進入30秒的profile收集時間,這段事件內猛刷新點擊go-tour瀏覽器上的頁面,盡量讓cpu佔用效能產生資料。 ###
(pprof) top10
Total: 3 samples
       1 33.3% 33.3% 1 33.3% MHeap_AllocLocked
       1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors
       1 33.3% 100.0% 1 33.3% runtime.sigprocmask
       0 0.0% 100.0% 1 33.3% MCentral_Grow
       0 0.0% 100.0% 2 66.7% main.Compile
       0 0.0% 100.0% 2 66.7% main.compile
       0 0.0% 100.0% 2 66.7% main.run
       0 0.0% 100.0% 1 33.3% makeslice1
       0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP
       0 0.0% 100.0% 2 66.7% net/http.(*conn).serve
###(pprof)web###############更多go語言知識請關注###go語言教學###欄位。 ###

以上是完全掌握Go的pprof使用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除