router.go 添加内容:
- beego.Router("/debug/pprof", &controllers.ProfController{})
- beego.Router("/debug/pprof/:app([\\w]+)", &controllers.ProfController{})
创建控制器:prof.go
添加内容:
- type ProfController struct {
- beego.Controller
- }
-
- func (c *ProfController) Get() {
- switch c.Ctx.Input.Param(":app") {
- default:
- pprof.Index(c.Ctx.ResponseWriter, c.Ctx.Request)
- case "":
- pprof.Index(c.Ctx.ResponseWriter, c.Ctx.Request)
- case "cmdline":
- pprof.Cmdline(c.Ctx.ResponseWriter, c.Ctx.Request)
- case "profile":
- pprof.Profile(c.Ctx.ResponseWriter, c.Ctx.Request)
- case "symbol":
- pprof.Symbol(c.Ctx.ResponseWriter, c.Ctx.Request)
- }
- c.Ctx.ResponseWriter.WriteHeader(200)
- }
通过访问地址:http://127.0.0.1:8080/debug/pprof查看数据
注意:点击页面链接,如查看goroutine详情:http://127.0.0.1:8080/debug/goroutine?debug=1,会有问题,需将地址更改为:http://127.0.0.1:8080/debug/pprof/goroutine?debug=1。没搞明白啥原因。
如果想使用工具分析:
go tool pprof http://127.0.0.1:8080/debug/pprof/profile
需要安装:Graphviz 工具
下载地址:https://graphviz.gitlab.io/download/
生成视图命令:web
pprof 部分字段解析:
2 allocs # 所有过去内存分析采样
0 block # 导致同步原语阻塞的堆栈跟踪
0 cmdline # 程序启动参数
4 goroutine # 所有当前goroutine堆栈跟踪
2 heap # 活动对象内存分配采样
0 mutex # 互斥锁跟踪
0 profile # 生成cpuprofile文件 生成文件使用go tool pprof工具分析
8 threadcreate # 创建系统线程的堆栈跟踪
0 trace # 对当前程序执行的跟踪 生成文件使用go tool trace工具分析
full goroutine stack dump # 显示所有goroutine的堆栈
生成火焰图
- 安装 go-torch
go get -v github.com/uber/go-torch - 安装FlameGraph
git clone https://github.com/brendangregg/FlameGraph.git
将FlameGraph目录加入到操作系统的环境变量中。 - 使用命令生成火焰图
go-torch -u http://127.0.0.1:8080 -t 30
30秒之后终端会初夏如下提示:Writing svg to torch.svg
用浏览器打开就可以看到详细信息。
火焰图的y轴表示cpu调用方法的先后,x轴表示在每个采样调用时间内,方法所占的时间百分比,越宽代表占据cpu时间越多。通过火焰图我们就可以更清楚的找出耗时长的函数调用,然后不断的修正代码,重新采样,不断优化。