pprof 和 trace 這東西可以分析GC具體的瓶頸位置!!以及每一個線程具體什麼時候運行的!!反正各種好處!
之前網上 大家各種抄襲,複製,我相信沒有幾個人真正玩過這玩意兒,因爲項目需要,最後我也是在國外網站上才找到真正使用方法!!下面介紹一下。
我設置了一個pprof 以及 trace 聯合使用的方案!
第一步:也是最重要的一步,就是下載谷歌瀏覽器!(之前一直卡這了)
第二步:下載 Graphviz http://graphviz.org/download/
安裝後配置環境變量,再path裏面添加安裝目錄!
第三步:添加以下測試代碼 (記得手動添加 _"net/http/pprof" 不然不會有效果!)
具體看源碼
package main import ( "net/http" "runtime" "os" "fmt" "runtime/trace" _"net/http/pprof" "runtime/debug" "time" "sync" ) func main() { //開啓強大的分析器 go pprof() //以下是運行測試(也可以貼你自己的)代碼 var c sync.Map for i:=0;i<100;i++{ time.Sleep(time.Second*1) go func(){ for j:=0;j<1000000;j++{ time.Sleep(time.Millisecond*20) c.Store(fmt.Sprintf("%d",j),j) fmt.Println(c.Load(fmt.Sprintf("%d",j))) } }() } time.Sleep(time.Second*20) fmt.Scan() } //運行pprof分析器 func pprof(){ go func() { //關閉GC debug.SetGCPercent(-1) //運行trace http.HandleFunc("/start", traces) //停止trace http.HandleFunc("/stop", traceStop) //手動GC http.HandleFunc("/gc", gc) //網站開始監聽 http.ListenAndServe(":6060", nil) }() } //手動GC func gc(w http.ResponseWriter, r *http.Request) { runtime.GC() w.Write([]byte("StartGC")) } //運行trace func traces(w http.ResponseWriter, r *http.Request){ f, err := os.Create("trace.out") if err != nil { panic(err) } err = trace.Start(f) if err != nil { panic(err) } w.Write([]byte("TrancStart")) fmt.Println("StartTrancs") } //停止trace func traceStop(w http.ResponseWriter, r *http.Request){ trace.Stop() w.Write([]byte("TrancStop")) fmt.Println("StopTrancs") }
第四步:接下來就可以享受了!!哈哈
程序運行後隨便打開一個CMD 然後輸入
go tool pprof http://localhost:6060/debug/pprof/profile
然後等30秒就分析好了
然後再輸入 web
就可以查看具體pprof的信息了
第五步:如果想看trace的信息 只需要再谷歌瀏覽器中輸入
然後等一會兒,再輸入
當然期間也可以 手動gc
再然後 程序運行的地方自動生成一個文件
在cmd中輸入 go tool trace trace.out(具體路徑)
它會生成一個路徑 一定要谷歌瀏覽器