当我们想要测试某个具体单元的性能时,可以使用Go语言提供的基准性能测试工具benchmark工具来完成该单元的性能测试。
但当我们想要从整体上对程序的性能做出评估,并定位到程序性能瓶颈对应的代码段时,benchmark工具就没有办法满足我们的需求了,此时我们可以使用pprof工具来帮助我们完成程序的性能调优工作。
01 常见优化方向
对于一个程序而言,常见的优化方向有cpu占用、内存占用、goroutine启动数量等,pprof为我们提供了分析程序这些方向性能的工具,另外还提供了分析阻塞(block),锁竞争(mutex)等的工具。
02 pprof的使用
在程序启动后,在浏览器打开http://localhost:6060/debug/pprof/
pprof给我们提供了终端工具与网页端的可视化工具来帮助我们定位性能存在优化空间的代码。
终端工具
分析程序的性能瓶颈,可以归纳为以下几个步骤:
1.查看程序性能问题种类
在程序启动后,使用windows的任务管理器或者Linux的top命令来查看我们的程序的cpu占用率,内存占用率等的数值,从而确定我们的程序存在什么性能瓶颈,是cpu占用过高?亦或是内存占用过高?
确认性能问题的种类后,可以使用对应的pprof命令来开启相应的分析工具:
# xxxx可以是profile(cpu占用)/heap(内存占用)/goroutine/mutex/block/threadcreate
# go tool pprof http://localhost:6060/debug/pprof/xxxx
# 等待一段时间后进入pprof工具
(pprof)
2.查看存在性能问题的函数
使用top命令,可以查看对应性能问题中最严重的几个函数,下面我们都以cpu占用率为例。top命令会展示cpu占用率最高的几个函数(top命令有一个默认的过滤,会筛去占用较小的函数)。
(pprof)top
这里有个小细节,top命令除了会展示我们程序中的函数外,还会展示占用率较高的库函数,如下图中sync.(*Mutex).Unlock:
我们可以忽略库函数,而直接看排名较后的我们自己程序里的函数,因为它们才是我们调优的主要对象。
3.查看存在性能问题的代码段
在确认了是哪个函数cpu占用比较高后,就可以使用list命令来获知是函数中具体哪一段代码造成的性能问题:
(pprof) list xxxx
网页端可视化工具
终端工具在程序较为复杂时,会显得不太直观,不利于我们快速分析程序的性能瓶颈,因此pprof也为我们提供了网页端的可视化工具。
1.调用关系可视化
(pprof)web
2.多种分析工具
输入下面的命令,将开启一个合集网页。
// xxxx可以使用的值与上文终端工具中的一致
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/xxxx"
所谓合集网页,就是这个网页上除了包含上文提到的大部分工具(top、graph调用关系图),并且还有火焰图(flame graph)等工具,来直观地定位程序的性能瓶颈的位置。
我们可以点击网页上的DOWNLOAD按钮,保存本次采样得到的分析报告。
需要注意的是该分析报告不是实时的,而是在执行命令时采样得到的数据(执行命令到网页开启之间的时间就是在采样,上文的终端工具也是相同的),在网页的右上端,可以查看本次采样的一些信息。