pprof 是用于可视化和分析性能分析数据的工具,可以对程序进行CPU分析、内存分析、组撒分析以及互斥锁的分析
pprof内置了两个库用于获取程序运行时的数据

  • runtime/pprof
    用来采集程序的运行数据进行分析
  • net/http/pprof
    采集http服务运行时的数据尽心分析

主要写下这次用到的结合beego的服务型应用的数据分析
首先在router.go中加入路由

beego.Router("/debug/pprof", &controllers.ProfController{})
beego.Router("/debug/pprof/:app([\\w]+)", &controllers.ProfController{})

并在controllers中加入控制器


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)
}

然后运行程序就可以通过web进行访问了,访问http://localhost:8080/debug/pprof将会看到这样一个页面:

image.png

可以访问他的子页面查看具体的分析结果。
  • allocs
    过去所有的内存分析
  • block
    阻塞情况,block profiling
  • cmdline
    程序启动时的命令参数
  • goroutine
    正在运行的goroutines ,以及他们之间的调用关系。
  • heap
    memory profiling,得到程序的内存信息
  • mutex
    查看导致互斥锁的竞争持有者的信息
  • profile
    访问这个连接会进行30s 的 cpu profiling,结束后生成一个profle文件下载
  • threadcreate
    查看创建线程的信息
  • trace
    当前程序执行的信息
  • full goroutine stack dump
    显示所有goroutine的信息

这边目前有个问题,点击对应标签无法访问到对应的页面,如点击goroutine,跳转的地址是http://localhost:8080/debug/goroutine?debug=1实际上需要访问的地址是http://localhost:8080/debug/pprof/goroutine?debug=1

go tool pprof 分析工具
使用go tool pprof工具分析prof文件进行分析,并且可以生成调用关系图或者火焰图

执行命令
go tool pprof --text http://127.0.0.1:8080/debug/pprof/profile
得到prof文件

下载prof文件

输入top可以查看cpu使用情况
cup使用情况

输入web生成图片
调用关系图

暂时先写这么多,火焰图没有用到


有疑问加站长微信联系(非本文作者)