go 程序性能调优 pprof 的使用 (二)

上一篇说了以命令行方式执行了pprof,这次我们学习以web方式运行pprof. 下面看个例子:

var datas []string
func main() {
   go func() {
      for  {
         log.Printf("len:%d",Add("gwyy"))
         time.Sleep(time.Second)
      }
   }()
   go func() {
      for  {
         Get()
         time.Sleep(time.Second)
      }
   }()
   _ = http.ListenAndServe(":6060",nil)
}
func Add(str string) int {
   data := []byte(str)
   datas = append(datas,string(data))
   return len(datas)
}
func Get() {
   res,_ :=http.Get("https://www.baidu.com/")
   defer res.Body.Close()
   body,_ := ioutil.ReadAll(res.Body)
   log.Println(body)
}

  

然后执行命令:

wget http://127.0.0.1:6060/debug/pprof/profile     

  

默认需要等待30秒,执行完毕后当前目录下有个采集profile文件,针对可视化界面,可以进行下一步分析的方法有两种:
 
方法1 (推荐)该命令将在指定端口号运行一个PProf分析用的页面

go tool pprof -http=:6001 profile 

  

方法2 通过web命令将profile文件以svg的文件格式写入图形,然后在web浏览器中将其打开

PS D:\> go tool pprof profile                                                                                           
Type: cpu
Time: Oct 13, 2020 at 12:49am (CST)
Duration: 30s, Total samples = 20ms (0.067%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web
(pprof)   

  如果出现错误 “Could not execute dot; may need to install graphviz” 那么要安装 graphviz组件

 

解析内容

通过PProf提供的可视化界面,我们能够更方便、更直观的看到go应用程序的调用链和使用情况等,另外在View菜单栏,PProf还支持多种分析方式切换

Top视图如图:

该视图与命令行下面的 top 命令作用和含义一样
 

Graph视图如图:

该视图展示的是整体的函数调用流程,框越大,线越粗,框颜色越鲜艳(红色),代表它占用时间越久,开销越大,相反框越小,颜色越浅,框颜色越淡,代表开销越小
 

Peek视图如图:

此图与top视图相比,增加了所属上下文信息的展示,既函数的输出调用者和被调用者
 

Source 视图如图:

该视图主要增加了面向源代码的追中和分析,可以看到其开销主要消耗在哪里
 

Flame Graph 视图如图

Flame Graph (火焰图)是动态的,调用顺序由上而下,(A->B->C->D) 每一快代表一个函数,颜色越鲜艳(红),区块越大,代表占CPU的时间越长,同时它还支持点击块进行深入分析。

这样就可以根据不同函数的多维度进行分析了,能够更好的观察其流转并发现问题。

posted @ 2020-10-13 10:44  梁天  阅读(47)  评论(0编辑  收藏