pprof是一個go程式性能分析工具,可以用于分析go程式的CPU使用率、記憶體使用情況等
項目中如何使用pprof
package main
import (
"log"
"net/http"
_ "net/http/pprof" //初始化包
"os"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1) //設定隻使用1個cpu
runtime.SetBlockProfileRate(1) //開啟對阻塞的追蹤
runtime.SetMutexProfileFraction(1) //開啟對鎖的追蹤
go func() {
//啟動一個http.server
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
//測試用
for { }
}
使用pprof
使用 go build 進行建構
浏覽器打開 http://localhost:8080/debug/pprof/,即可看到如下頁面
名額說明:
allocs 記憶體配置設定情況的采樣資訊 可以用浏覽器打開,但可讀性不高
blocks 阻塞操作情況的采樣資訊 可以用浏覽器打開,但可讀性不高
cmdline 顯示程式啟動指令及參數 可以用浏覽器打開,這裡會顯示 ./go-pprof-practice
goroutine 目前所有協程的堆棧資訊 可以用浏覽器打開,但可讀性不高
heap 堆上記憶體使用情況的采樣資訊 可以用浏覽器打開,但可讀性不高
mutex 鎖争用情況的采樣資訊 可以用浏覽器打開,但可讀性不高
profile CPU 占用情況的采樣資訊 浏覽器打開會下載下傳檔案
threadcreate 系統線程建立情況的采樣資訊 可以用浏覽器打開,但可讀性不高
trace 程式運作跟蹤資訊 浏覽器打開會下載下傳檔案
用法一: 排查CPU占用過高
//指令
go tool pprof http://localhost:6060/debug/pprof/profile
//再輸入 top
//再輸入 list 辨別名 即可查詢到相關詳細資訊,如下圖顯示,可以找到哪裡占用cpu比較高,可以看到,
//這裡有一個大循環,是占用大量cpu的,
用法二: 排查占用記憶體過高
//指令一樣,隻不過 list的對象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/heap
//2. top
//3. list 對象名
用法三: 排查頻繁記憶體回收
通過如下指令 GODEBUG=gctrace=1 ./main | grep gc 可以檢視到程式的記憶體回收情況
//指令一樣,隻不過 list的對象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/allocs
//2. top
//3. list 對象名
用法四: 排查協程洩露
//指令一樣,隻不過 list的對象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/goruntine
//2. top
//3. list 對象名
用法五: 排查鎖的争用
//指令一樣,隻不過 list的對象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/mutex
//2. top
//3. list 對象名
用法六: 排查阻塞的情況
//指令一樣,隻不過 list的對象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/block
//2. top
//3. list 對象名
結語:
其實還有 火焰圖等相關知識,但是本次遇到的bug,沒有用到,這裡就不寫了,感興趣的小夥伴,可以自己查資料哈