轉https://blog.csdn.net/suiban7403/article/details/79144394
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/suiban7403/article/details/79144394
go的pprof可以用來對服務的性能進行檢測,其中net/http/pprof包用來檢測web服務器的相關的性能的分析,包括goroutine的數量,heap的大小問題。
簡單使用
package main import ( "fmt" "log" "net/http" _ "net/http/pprof" "time" ) func main() { // 開啟pprof go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() go hello() select {} } func hello() { for { go func() { fmt.Println("hello word") }() time.Sleep(time.Millisecond * 1) } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
如上所示,實現了一個簡單函數,在for循環內部不停的創建go 並調用IO輸出hello word。
在主函數的內部通過http.ListenAndServe(“localhost:6060”, nil) 監聽6060端口,等待用戶查看相關的性能信息.
一定要注意包含_ “net/http/pprof”這個包。。
以上代碼就實現了一個pprof監控性能的代碼,我們只需要在瀏覽器中執行http://localhost:6060/debug/pprof/
就會得到相對應的程序的信息。
結果如下
由此可見,我們這個程序此時正有六個go協程正在運行。
進階
上述是我們對pprof的簡單使用,我們還可以通過使用go tool pprof 對這個程序進行更詳盡的性能的分析。
主要分析的內容包括:
關於golang運行環境heap的信息、內存mem等
http://localhost:6060/debug/pprof/heap
關於pprof和cpu的相關信息
http://localhost:6060/debug/pprof/profile
我們通過使用這兩個命令,在我們的cmd下執行得到相關的信息。
1 使用callgrind 命令和qcachegrind查看性能
以查看cpu信息為例:
(1)啟動我們的web服務器,
(2)在cmd下執行:go tool pprof http://localhost:6060/debug/pprof/profile 命令,並等待30s,讓其收集我們的web服務器的相關性能
(3)
執行完畢,他提示我們使用help命令查看相關的命令。這里我們可以使用callgrind命令將web服務的相關CPU信息輸出為一個.out文件
需要注意的是我們需要安裝qcachegrind工具來查看我們輸出的文件。
注意該.out文件存放到我們當前用戶目錄下,或者cmd所在的目錄。。
在qcachegrind下,我們可以詳細的看當前服務,那個函數耗費了多少的cpu和時間,找到我們的性能瓶頸。
2 使用web命令生成svg圖
在30s等待之后,我們使用web命令生成svg圖,查看軟件的流程以及性能瓶頸
注意在生成svg時需要先安裝graphviz-2.38
工具用來繪制圖。安裝graphviz-2.38時需要將bin目錄放到path下。。最后將生成svg圖片用瀏覽器打開查看即可。
3heap相關信息
- go tool pprof -inuse_space http://127.0.0.1:6060/debug/pprof/heap
我們可以使用上述命令,查看內存中正在使用的一些內存信息,可以看到消耗內存的函數主要是哪些。
- go tool pprof -alloc_space http://127.0.0.1:8080/debug/pprof/heap
使用上述命令查看內存對象分配的一些相關信息,從而得知,是什么地方創建對象消耗內存。
- top -cum
通過在上述命令,能夠明確函數的調用過程中內存消耗的情況。