前言

GolangGopprofpprofEchoGinpprofgRPC
有兴趣追更的同学欢迎微信关注「网管叨bi叨」
Golangpprof
profileprofilingpprofprofprofileprofile
Go
  • CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据
  • Memory Profile(Heap Profile):报告程序的内存使用情况
  • Block Profile:报告导致阻塞的同步原语的情况,可以用来分析和查找锁的性能瓶颈
  • Goroutine Profile:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的

工具型应用的性能分析

如果你的应用是工具类应用,执行完任务就结束退出,可以使用

pprof.StartCPUProfile()w io.WriterStopCPUProfile()
main.go

应用执行结束后,就会生成一个文件,保存了我们应用的 CPU使用情况数据。

WriteHeapProfilestartstop

我们的文章会把重点篇幅放在服务型应用的性能分析,所以关于工具型应用的性能分析就说这么多。

服务型应用性能分析

gRPCnet/http/pprof
http.DefaultServeMuxhttp.ListenAndServe("0.0.0.0:8000", nil)net/http/pprof
ServerMux
http://localhost/debug/pprof

这个路径下几个需要重点关注的子页面有:

/debug/pprof/profile?=seconds=60/debug/pprof/heap/debug/pprof/block/debug/pprof/goroutines
1.11go toolpprofpprof

使用go tool pprof

go tool pprofpprofHTTPpprofpprofhelp
pprof --help

CPU性能分析

CPUgo tool pprof/debug/pprof/profile
?seconds=60
help
pprofgraphvizbrew install graphviz

列出最耗时的地方

topN
累加值 cumulative

生成函数调用图

pproftoplistdisasmsvggifpng
webwebsvggraphviz



图中每个方框对应应用程序运行的一个函数,方框越大代表函数执行的时间越久(函数执行时间会包含它调用的子函数的执行时间,但并不是正比的关系);方框之间的箭头代表着调用关系,箭头上的数字代表被调用函数的执行时间。

这里还要提两个比较有用的方法,如果应用比较复杂,生成的调用图特别大,看起来很乱,有两个办法可以优化:

web funcNamego tool pprof--nodefration--nodefration=0.05

分析函数性能

pproflist

内存性能分析

/debug/pprof/profile/debug/pprof/heap
top N
CPU
websvg
--inuse_objects--alloc-space

go-torch 和火焰图

profilingpprofprofiling



火焰图 svg 文件可以通过浏览器打开,它对于调用图的优点是:可以通过点击每个方块来分析它上面的内容

火焰图的调用顺序从下到上,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。

http://localhost/debug/pprof/profile
-u --url-s --suffix/debug/pprof/profile--seconds
$PATH

总结

pprofpprofprofilepprof
pprof
pprofPostmanJmeterpprof
EchoGinpprofpprofgRPC
微信关注公众号「网管叨bi叨」每周教会你一个进阶知识。

相关阅读