一、环境部署
安装graphviz
graphviz用于生成.svg格式图形数据,用go tool pprof进行分析时,生成web图的依赖,mac可通过brew安装
brew install graphviz
安装过程中遇到缺少依赖的情况会报找不到文件的错误,安装相应的依赖即可
安装好缺少的依赖,继续通过brew安装graphviz即可
安装并配置FlameGraph
git下载flameGraph
git clone https://github.com/brendangregg/FlameGraph.git
将flameGraph配置到mac系统的环境变量
sudo vim ~/.bash_profile
输入密码,在最后一行添加环境变量,$PATH后面是flameGraph的保存路径
export PATH=$PATH:/usr/local/FlameGraph
编辑完需要 source ~/.bash_profile 生效,可通过以下命令测试
flamegraph.pl -h
二、代码配置
在服务中定义监控数据项的路由
import (
pprof "net/http/pprof"
)
func init() {
registerHandler()
registerHttpPprofHandler()
}
// registerHttpPpofHandler 注册性能分析相关路由
func registerHttpPprofHandler() {
server.RegisterHandleFunc("/debug/pprof/", pprof.Index)
server.RegisterHandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
server.RegisterHandleFunc("/debug/pprof/profile", pprof.Profile)
server.RegisterHandleFunc("/debug/pprof/symbol", pprof.Symbol)
server.RegisterHandleFunc("/debug/pprof/trace", pprof.Trace)
server.RegisterHandleFunc("/debug/pprof/{name}", pprof.Index)
}
三、使用go tool pprof
注册完后访问http://localhost/debug/pprof端点,它会得到类似下面的页面内容:
几个重点需要关注的页面:
- /debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续30s,并生成一个文件供下载,可以通过带参数?=seconds=60进行60秒的数据采集
- /debug/pprof/heap:Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
- /debug/pprof/block:block Profiling 的路径
- /debug/pprof/goroutines:运行的
- goroutines 列表,以及调用关系
以cpu性能分析为例:
go tool pprof http://127.0.0.1:8010/debug/pprof/profile
等待30s以后会生成性能分析,并出现交互命令,通过web命令可打开浏览器查看性能图
图中每个方框对应应用程序运行的一个函数,方框越大代表函数执行的时间越久(函数执行时间会包含它调用的子函数的执行时间,但并不是正比的关系);方框之间的箭头代表着调用关系,箭头上的数字代表被调用函数的执行时间。
这里还要提两个比较有用的方法,如果应用比较复杂,生成的调用图特别大,看起来很乱,有两个办法可以优化:
-
使用 web funcName 的方式,只打印和某个函数相关的内容
-
运行 go tool pprof 命令时加上 --nodefration 参数,可以忽略内存使用较少的函数,比如–nodefration=0.05表示如果调用的子函数使用的 CPU、memory 不超过 5%,就忽略它,不要显示在图片中。
四、火焰图分析
生成的调用图有时很复杂,可借助火焰图进行分析,需要提前安装FlameGraph。
go tool pprof会在本地保存一份profile文件,通过go tool pprof命令带上-http打开profile文件即可在浏览器查看
go tool pprof -http localhost:6001 /Users/xiangzhe/pprof/pprof.samples.cpu.005.pb.gz
切换到flameGraph即可查看火焰图
每个方块代表一个函数,它下面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短,光标移动到方块可查看cpu占用时间,点击方块可定位到下一层级。