golang利用pprof与go-torch如何做性能分析

  

  

软件开发过程中,项目上线并不是终点。上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写。golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能方便了不少。加上超级的火焰图,可视化显示,让我们在分析程序时更简单明了。

  

pprof有两个包用来分析程序一个是net/http/pprof另一个是运行时/pprof,net/http/pprof只是对运行时/pprof包进行封装并用http暴露出来,如下图源码所示:

  

 golang利用pprof与go-torch如何做性能分析

  

  

pprof分析网络项目,非常的简单只需要导入包即可。
  

        _ "net/http/pprof "      

编写一个小的web服务器

        主要包      导入(   _ "net/http/pprof”   "net/http”   “时间”   “数学/兰德”   “fmt”   )      var计算int64=0   函数main () {   去calCount ()      http。HandleFunc(“/测试”,测试)   http。handlerData HandleFunc(“/数据”)      错:=http。nil ListenAndServe (“9909”)   如果犯错!=nil {   恐慌(err)   }   }      func handlerData http (w。ResponseWriter r * http.Request) {   qUrl:=r.URL   fmt.Println (qUrl)   fibRev:=Fib ()   var fib uint64   我:=0;我& lt;5000;我+ + {   fib=fibRev ()   fmt。Println (“fib=", fib)   }   str:=RandomStr (RandomInt (100、500))   str=fmt。Sprintf (“Fib=% d;字符串=% s”、fib、str)   w.Write([]字节(str))   }      函数测试(w http。ResponseWriter r * http.Request) {   fibRev:=Fib ()   var fib uint64   指数:=计数   加勒比海盗:=([]uint64、索引)   var我int64   为;我& lt;指数;我+ + {   fib=fibRev ()   arr[我]=无伤大雅的谎言   fmt。Println (“fib=", fib)   }   time . sleep(时间。毫秒* 500)   str:=fmt。Sprintf (“Fib=% v”, arr)   w.Write([]字节(str))   }      uint64 Fib()函数func () {   var x, y uint64=0, 1   uint64返回func () {   x, y=y、x + y   返回x   }   }      var letterRunes=[]神符(“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890”)   字符串函数RandomStr (num int) {   种子:=time.Now () .UnixNano ()   如果种子& lt;=0 {   .UnixNano种子=time.Now () ()   }   rand.Seed(种子)   b:=([]符文,num)   我:=b{范围   b[我]=letterRunes [rand.Intn (len (letterRunes)))   }   返回字符串(b)   }      func RandomInt int(最小,最大int) {   .UnixNano rand.Seed (time.Now () ())   返回兰德。Intn(最大值-最小值+ 1)+分钟   }      func calCount () {   timeInterval:=time.Tick (time.Second)      为{   选择{   我:=& lt; - timeInterval:   数=int64 (i.Second ())   }   }   }      9909年

web服务监听端口

  

web服务器有两个http方法
  

  

测试:根据当前的秒数做斐波那契计算
  

  

数据:做一个5000年的斐波那契计算并返回一个随机的字符串

  

运行程序,通过访问http://192.168.3.34:9909/调试/pprof/可以查看网页版的概要文件相关信息

  

 golang利用pprof与go-torch如何做性能分析

  

这几个路径表示的是

  

/调试/pprof/简介:访问这个链接会自动进行CPU配置,持续30年代,并生成一个文件供下载

  

/调试/pprof/块:Goroutine阻塞事件的记录。默认每发生一次阻塞事件时取样一次。

  

/调试/pprof/了Goroutine:活跃Goroutine的信息的记录。仅在获取时取样一次。

  

/调试/pprof/堆:堆内存分配情况的记录。默认每分配512 k字节时取样一次。

  

/调试/pprof/互斥:查看争用互斥锁的持有者。

  

/调试/pprof/threadcreate:系统线程创建情况的记录。仅在获取时取样一次。

  

  

除了这些golang为我提供了更多方便的方法,用于分析、下面我们来用命令去访问详细的信息

  

我们用wrk来访问我们的两个方法,这样我们的服务会处在高速运行状态,取样的结果会更准确

        wrk 20 - t - c 5 - 3 m公司http://192.168.3.34:9909的数据   wrk 20 - t - c 5 - 3 m http://192.168.3.34:9909测试

golang利用pprof与go-torch如何做性能分析