go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)

pprof 和 trace 这东西可以分析GC具体的瓶颈位置!!以及每一个线程具体什么时候运行的!!反正各种好处!

之前网上 大家各种抄袭,复制,我相信没有几个人真正玩过这玩意儿,因为项目需要,最后我也是在国外网站上才找到真正使用方法!!下面介绍一下。

我设置了一个pprof 以及 trace 联合使用的方案!

第一步:也是最重要的一步,就是下载谷歌浏览器!(之前一直卡这了)

第二步:下载 :Graphviz (Stable 2.38 Windows install packages)

 http://graphviz.org/download/ 

 

安装后配置环境变量,再path里面添加安装目录!

 

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第1张图片

 

第三步:添加以下测试代码 (记得手动添加   _"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
或者 
go tool pprof --alloc_objects http://localhost:6060/debug/pprof/heap

然后等30秒就分析好了   

分析完成后!然后再输入 

web

就好了w  水电b

就可以查看具体pprof的信息了

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第2张图片

 

第五步:如果想看trace的信息 只需要再谷歌浏览器中输入

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第3张图片

然后等一会儿,再输入

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第4张图片

当然期间也可以 手动gc

然后 程序运行的地方自动生成一个文件 

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第5张图片

在cmd中输入 go tool trace    trace.out(具体路径)

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第6张图片

它会生成一个路径 一定要谷歌浏览器

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第7张图片

go pprof 及 trace 完整操作指南 GC或性能分析 (windows平台linux平台皆可)_第8张图片

 

补充:

最简单方法

1)增加如下代码

//导入包
import (
    "net/http"
    _ "net/http/pprof"
)

//增加如下代码
go func() {
        fmt.Println(http.ListenAndServe(":5567", nil))
}()

2)执行curl 127.0.0.1:5567/debug/pprof/trace?seconds=10 > trace.data,获取到trace.data数据

3) 执行 go tool trace -http=':8888' your_app_bin trace.data。会跳转到浏览器查看trace到数据.

 

 

你可能感兴趣的:(Go语言)