了解到go中有pprof包来做代码的性能监控,可以查看堆栈、cpu信息等。在两个地方有包:
net/http/pprof
runtime/pprof
但是使用起来并不是特别好用(不是特别直观)。之前在接触systemtap的时候,了解到火焰图这个东西。后来了解到uber开源了一个生成火焰图的工具——go-torch。
下面整理下,之前使用分析的一个过程。
1 添加pprof代码
首先我们要在实例的main函数中添加pprof的相关的代码:
package main
import (
...
_"net/http/pprof"
"github.com/astaxie/beego"
"os/exec"
"net/http"
)
func main() {
go func(){
http.ListenAndServe(":6789", nil)
}()
这样我们可以通过访问URL:http://<ip>:6789/debug/pprof/得到堆栈信息
通过访问URl:http://<ip>:6789/debug/pprof/profile获得函数调用CPU消耗的情况(不是特别直观,一堆文字)
2 生成火焰图工具安装
需要安装两个工具:FlameGraph脚本和go-torch
git clone https://github.com/brendangregg/FlameGraph.git
cp flamegraph.pl /usr/local/bin
或
export FlameGraph所在的path
go get -v github.com/uber/go-torch
3 测试
完成安装之后,运行测试程序和测试工具:
go-torch -u http://<ip>:6789 -t60 -p > profile-local.svg
表示采集60s的数据(默认30s),完了后会在当前目录生成一张火焰图,可以用浏览器打开:
4 如何看图
参考:https://blog.csdn.net/wwwasw/article/details/52137630
每个框代表一个栈里的一个函数 Y轴代表栈深度(栈桢数)。最顶端的框显示正在运行的函数,这之下的框都是调用者。在下面的函数是上面函数的父函数 X轴代表采样总量。从左到右并不代表时间变化,从左到右也不具备顺序性 框的宽度代表占用CPU总时间。宽的框代表的函数可能比窄的运行慢,或者被调用了更多次数。框的颜色深浅也没有任何意义 如果是多线程同时采样,采样总数会超过总时间