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的时间越长,同时它还支持点击块进行深入分析。
这样就可以根据不同函数的多维度进行分析了,能够更好的观察其流转并发现问题。