最近由于项目中接口调用有挺多 延迟的,因此就借此机会学习下go 的pprof 分析下项目性能。
我们的go 程序不是http服务,是使用tars框架开发的rpc 服务。根据官方介绍,非http服务可以使用 runtime/pprof 包来记录性能profile。开始时候没搞懂跟 /net/http/pprof有啥区别。那就先尝试使用 runtime/pprof先,然后需要在main函数中添加如下代码
f, err := os.Create("cpu_profile.pprof")
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
defer f.Close()
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
其实这里主要就是 StartCPUProfile 函数可以开启profile记录,查看过源码,里面会每隔100 毫秒进行一次写入,但是我在实际项目中并没有看到间隔写入,现在还没搞清楚到底为什么,而主要是通过 defer pprof.StopCPUProfile() 结束main的时候才一次性写入到指定的文件中。觉得很奇怪。写哪里先暂时放一放,拿到profile后 需要执行go tool pprof xxx cpu_profile.pprof其中 xxx 时你的程序, cpu_profile.pprof 文件就是我们程序中写入的文件,这个可以拿到本地上查看性能。通过go tool 后就会进入到pprof 的交互界面,然后我们执行web 就可以生成 调用链相关的svg 文件,通过浏览器就可以查看了。查看时候可以看到其中的调用情况,这个svg图展示的其实就是函数的采样数据,通过里面的占比可以看出哪个函数占cpu时间最长,不要单看使用时间,要看占比,然后在刚才的pprof交互界面中输入 traces 打印下所有堆栈,就可以知道占比比较高的函数的调用站了。今天先记录这么多吧