pprof 和 trace 这东西可以分析GC具体的瓶颈位置!!以及每一个线程具体什么时候运行的!!反正各种好处!
之前网上 大家各种抄袭,复制,我相信没有几个人真正玩过这玩意儿,因为项目需要,最后我也是在国外网站上才找到真正使用方法!!下面介绍一下。
我设置了一个pprof 以及 trace 联合使用的方案!
具体看源码
1package main
2import (
3 "net/http"
4 "runtime"
5 "os"
6 "fmt"
7 "runtime/trace"
8 _"net/http/pprof"
9 "runtime/debug"
10 "time"
11 "sync"
12)
13func main() {
14 //开启强大的分析器
15 go pprof()
16 //以下是运行测试(也可以贴你自己的)代码
17 var c sync.Map
18 for i:=0;i<100;i++{
19 time.Sleep(time.Second*1)
20 go func(){
21 for j:=0;j<1000000;j++{
22 time.Sleep(time.Millisecond*20)
23 c.Store(fmt.Sprintf("%d",j),j)
24 fmt.Println(c.Load(fmt.Sprintf("%d",j)))
25 }
26 }()
27 }
28 time.Sleep(time.Second*20)
29 fmt.Scan()
30}
31//运行pprof分析器
32func pprof(){
33 go func() {
34 //关闭GC
35 debug.SetGCPercent(-1)
36 //运行trace
37 http.HandleFunc("/start", traces)
38 //停止trace
39 http.HandleFunc("/stop", traceStop)
40 //手动GC
41 http.HandleFunc("/gc", gc)
42 //网站开始监听
43 http.ListenAndServe(":6060", nil)
44 }()
45}
46//手动GC
47func gc(w http.ResponseWriter, r *http.Request) {
48 runtime.GC()
49 w.Write([]byte("StartGC"))
50}
51//运行trace
52func traces(w http.ResponseWriter, r *http.Request){
53 f, err := os.Create("trace.out")
54 if err != nil {
55 panic(err)
56 }
57 err = trace.Start(f)
58 if err != nil {
59 panic(err)
60 }
61 w.Write([]byte("TrancStart"))
62 fmt.Println("StartTrancs")
63}
64//停止trace
65func traceStop(w http.ResponseWriter, r *http.Request){
66 trace.Stop()
67 w.Write([]byte("TrancStop"))
68 fmt.Println("StopTrancs")
69}
第四步:接下来就可以享受了!!哈哈
程序运行后随便打开一个CMD 然后输入
go tool pprof http://localhost:6060/debug/pprof/profile
然后等30秒就分析好了
然后再输入 web
就可以查看具体pprof的信息了
第五步:如果想看trace的信息 只需要再谷歌浏览器中输入
然后等一会儿,再输入
当然期间也可以 手动gc
再然后 程序运行的地方自动生成一个文件
在cmd中输入 go tool trace trace.out(具体路径)
它会生成一个路径 一定要谷歌浏览器