所有文章

应用性能分析

本文介绍使用pprof工具分析go程序的方法,让你快速找到程序中的性能瓶颈。

基本原理

在go的安装包中提供了pprof性能分析工具,使用方法为go tool pprof <运行时数据>,然后它可以根据我们提供的数据分析出程序中各函数据CPU使用情况、内存使用情况、各协程运行情况,其中<运行时数据>的获取有两种方式,一种是让程序在执行时直接保存运行时数据,一种是通过程序的HTTP端口动态获取,这两种方式都需要入侵代码,也就是在目标程序中插入runtime/pprofnet/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的逻辑加进去,把它做成可以动态打开和关闭的模块,这样我们可以在线上应用出问题时进行远程分析,以最快最直接的方式找出问题点并解决它。


编写日期:2018-10-17