应用性能分析
本文介绍使用pprof工具分析go程序的方法,让你快速找到程序中的性能瓶颈。
基本原理
在go的安装包中提供了pprof性能分析工具,使用方法为go tool pprof <运行时数据>
,然后它可以根据我们提供的数据分析出程序中各函数据CPU使用情况、内存使用情况、各协程运行情况,其中<运行时数据>的获取有两种方式,一种是让程序在执行时直接保存运行时数据,一种是通过程序的HTTP端口动态获取,这两种方式都需要入侵代码,也就是在目标程序中插入runtime/pprof
或net/http/pprof
两个包的代码来生成pprof工具需要的数据。下面以HTTP方式为例介绍pprof用法。
准备数据
只需在目标程序中以匿名方式引入net/http/pprof
包,然后启动一个http服务即可,如下:
import _ "net/http/pprof"
func main(){
go func() {
logger.Error(http.ListenAndServe(":8081", nil))
}()
...
}
然后pprof就可以从8081端口上分析程序了。
开始分析
这时先在本地安装一个命令行工具,pprof在生成图片时会用到:brew install graphviz
(mac命令)
分析CPU性能:
go tool pprof http://localhost:8081/debug/pprof/profile
命令执行后会阻塞30秒来收集数据,然后进入一个shell界面,等待输入命令:
Fetching profile over HTTP from http://localhost:8081/debug/pprof/profile
Saved profile in /Users/sycki/pprof/pprof.samples.cpu.001.pb.gz
Type: cpu
Time: Oct 16, 2018 at 6:31pm (CST)
Duration: 30.01s, Total samples = 240ms ( 0.8%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) png
这时我们输入png
它就会生成一张png的图片,很清楚的画出占用CPU时间较多函数以及它们关系:
分析内存的方法一样:
go tool pprof http://localhost:3999/debug/pprof/heap
协程执行情况:
go tool pprof http://localhost:3999/debug/pprof/goroutine
除了上面三项还有其它数据可以分析,具体可以打开提供数据的端口查看:http://localhost:8081/debug/pprof/
。
小结
可以看出pprof是个很实用的工具,但有一点,就是需要侵入代码,所以可以在编写程序的时候预先把pprof的逻辑加进去,把它做成可以动态打开和关闭的模块,这样我们可以在线上应用出问题时进行远程分析,以最快最直接的方式找出问题点并解决它。