Golang大杀器之性能剖析 PProf

 go教练   2019-06-11 14:09   17 人阅读  0 条评论

想要进行性能优化,首先瞩目在Go自身提供的工具链来作为分析依据,本文将带你学习、使用Go后花园,涉及如下:

runtime/pprof:采集程序(非Server)的运行数据进行分析net/http/pprof:采集HTTP Server的运行时数据进行分析 是什么

pprof是用于可视化和分析性能分析数据的工具

pprof以profile.proto读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)

profile.proto是一个Protocol Buffer v3的描述文件,它描述了一组callstack和symbolization信息,作用是表示统计分析的一组采样的调用栈,是很常见的stacktrace配置文件格式

支持什么使用模式Report generation:报告生成Interactive terminal use:交互式终端使用Web interface:Web 界面 可以做什么CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序CPU(含寄存器)的使用情况,可确定应用程序在主动消耗CPU周期时花费时间的位置Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏Block Profiling:阻塞分析,记录goroutine阻塞等待同步(包括定时器通道)的位置Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况 一个简单的例子

我们将编写一个简单且有点问题的例子,用于基本的程序初步分析

编写demo文件

(1)demo.go文件内容:

package main import ( "log" "net/http" _ "net/http/pprof" "github.com/EDDYCJY/go-pprof-example/data" ) func main() { go func() { for { log.Println(data.Add("https://github.com/EDDYCJY")) } }() http.ListenAndServe("0.0.0.0:6060", nil) }

(2)data/d.go文件内容:

package data var datas []string func Add(str string) string { data := []byte(str) sData := string(data) datas = append(datas, sData) return sData }

运行这个文件,你的HTTP服务会多出/debug/pprof的endpoint可用于观察应用程序的情况

分析一、通过Web界面

查看当前总览:访问http://127.0.0.1:6060/debug/pprof/

/debug/pprof/ profiles: 0 block 5 goroutine 3 heap 0 mutex 9 threadcreate full goroutine stack dump

这个页面中有许多子页面,咱们继续深究下去,看看可以得到什么?

$HOST/debug/pprof/profile $HOST/debug/pprof/block $HOST/debug/pprof/goroutine $HOST/debug/pprof/heap $HOST/debug/pprof/mutex $HOST/debug/pprof/threadcreate 二、通过交互式终端使用

(1)go tool pprofhttp://localhost:6060/debug/pprof/profile?seconds=60

$go tool pprof http://localhost:6060/debug/pprof/profile\?seconds\=60 Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile?seconds=60 Saved profile in /Users/eddycjy/pprof/pprof.samples.cpu.007.pb.gz Type: cpu Duration: 1mins, Total samples = 26.55s (44.15%) Entering interactive mode (type "help" for commands, "o" for options)(pprof)

执行该命令后,需等待60秒(可调整seconds的值),pprof 会进行CPU Profiling。结束后将默认进入pprof的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行pprof help查看命令说明

(pprof)top10 Showing nodes accounting for 25.92s, 97.63% of 26.55s total Dropped 85 nodes(cum <=>最后一列为函数名称,在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,加以优化

(2)go tool pprofhttp://localhost:6060/debug/pprof/heap

$go tool pprof http://localhost:6060/debug/pprof/heap Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap Saved profile in /Users/eddycjy/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz Type: inuse_space Entering interactive mode (type "help" for commands, "o" for options) (pprof) top Showing nodes accounting for 837.48MB, 100% of 837.48MB total flat flat% sum% cum cum% 837.48MB 100% 100% 837.48MB 100% main.main.func1

-inuse_space:分析应用程序的常驻内存占用情况

-alloc_objects:分析应用程序的内存临时分配情况

(3) go tool pprofhttp://localhost:6060/debug/pprof/block

(4) go tool pprofhttp://localhost:6060/debug/pprof/mutex

三、PProf可视化界面

这是令人期待的一小节。在这之前,我们需要简单的编写好测试用例来跑一下

编写测试用例

(1)新建data/d_test.go文件内容:

package data import "testing" const url = "https://github.com/EDDYCJY" func TestAdd(t *testing.T) { s := Add(url) if s == "" { t.Errorf("Test.Add error!") } } func BenchmarkAdd(b *testing.B) { for i := 0; i <>(2)执行测试用例

$go test -bench=. -cpuprofile=cpu.prof pkg: github.com/EDDYCJY/go-pprof-example/data BenchmarkAdd-4 10000000 187 ns/op PASS ok github.com/EDDYCJY/go-pprof-example/data 2.300s

-memprofile也可以了解一下

启动PProf可视化界面方法一:$go tool pprof -http=:8080 cpu.prof方法二:$go tool pprof cpu.prof$(pprof)web

如果出现Could not execute dot; may need to install graphviz.,就是提示你要安装graphviz了(请右拐谷歌)

查看PProf可视化界面

(1)Top

 微信截图_20190611093228.png

(2)Graph

 微信截图_20190611093252.png

框越大,线越粗代表它占用的时间越大哦

(3)Peek

 微信截图_20190611093303.png

(4)Source

 微信截图_20190611093320.png

通过PProf的可视化界面,我们能够更方便、更直观的看到Go应用程序的调用链、使用情况等,并且在View菜单栏中,还支持如上多种方式的切换

四、PProf火焰图

另一种可视化数据的方法是火焰图,需手动安装原生 PProf 工具:

(1) 安装PProf

$go get -u github.com/google/pprof

(2) 启动PProf可视化界面:

$pprof -http=:8080 cpu.prof

(3) 查看PProf可视化界面

打开PProf的可视化界面时,你会明显发现比官方工具链的 PProf精致一些,并且多了Flame Graph(火焰图)

它就是本次的目标之一,它的最大优点是动态的。调用顺序由上到下(A->B->C->D),每一块代表一个函数,越大代表占用CPU的时间更长。同时它也支持点击块深入进行分析!

 微信截图_20190611093333.png

以上就是今天给大家推荐Golang的性能剖析PProf,如果你还想了解更多关于golang的知识技巧,可以继续关注我们http://fastgolang.com/

本文地址:http://fastgolang.com/54.html
版权声明:本文为原创文章,版权归 go教练 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?