golang之性能分析工具pprof

PProf 是一个 Go 程序性能分析工具,可以分析 CPU、内存等性能。Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/pprof 包即可获取程序的 profile 文件,并通过该文件来进行性能分析。

 

第一种: 共用一套web服务

在 gin 中使用 pprof 功能,需要用到 github.com/gin-contrib/pprof middleware,使用时只需要调用 pprof.Register() 函数即可

go get  github.com/gin-contrib/pprof

 

使用:

package router

import (
    "github.com/gin-contrib/pprof"
    ....
)

// Load loads the middlewares, routes, handlers.
func Load(g *gin.Engine, mw ...gin.HandlerFunc) *gin.Engine {
    // pprof router
    pprof.Register(g)
    ....
}

更多使用方式: github.com/gin-contrib/pprof

 

第二种:新开一个接口

a)引入pprof包

_ "net/http/pprof"

b)监听新端口

go func() {
        log.Println(http.ListenAndServe(":6060", nil)) 
}()

 

 

 

分析命令:

go tool pprof http://127.0.0.1:8080/debug/pprof/pro

 

  • allocs:查看过去所有内存分配的样本,访问路径为 $HOST/debug/pprof/allocs
  • block:查看导致阻塞同步的堆栈跟踪,访问路径为 $HOST/debug/pprof/block
  • cmdline: 当前程序的命令行的完整调用路径。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪,访问路径为 $HOST/debug/pprof/goroutine
  • heap:查看活动对象的内存分配情况, 访问路径为 $HOST/debug/pprof/heap
  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为 $HOST/debug/pprof/mutex
  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件,访问路径为 $HOST/debug/pprof/profile
  • threadcreate:查看创建新 OS 线程的堆栈跟踪,访问路径为 $HOST/debug/pprof/threadcreate

 

获取profile采集信息

go tool pprof http://127.0.0.1:8080/debug/pprof/profile

也可以通过浏览器访问该地址来获取当前服务状态, 包含CPU和内存情况

 

 

 

性能分析:

基于以上获取到的程序的profile信息,并且进入到的pprof交互界面,就可以在界面上执行topN获取采集信息

 

通过topN的输出可以分析出那些函数占用的CPU时间片最多,那些函数可能存在性能问题.

 

通过上面的输出结果,可以很清晰地看到消耗最多 CPU 资源的 10 个调用方法。

这里需要注意的是第三列的 sum% 的字段,表示的是前 N 行的 flat% 列的数值总和

参数说明: 

  • flat: 表示函数自身的 CPU 使用时间,单位为纳秒
  • flat%:表示函数自身的 CPU 使用时间占总时间的百分比
  • sum%: 表示函数及其内部调用的其他函数的 CPU 使用时间占总时间的百分比
  • cum: 表示函数及其内部调用的其他函数的 CPU 使用时间之和,单位为纳秒
  • cum%: 表示函数及其内部调用的其他函数的 CPU 使用时间之和占总时间的百分比

flat 和 cum 的区别在于: flat 只统计函数自身的 CPU 使用时间,不包括调用其他函数的时间,而 cum 则包括了函数自身的时间和调用其他函数的时间。

 

 

 

 

还可以使用svg来生成svg文件

 

前提需要下载并安装Graphviz: https://graphviz.org/

重新分析文件:

go tool pprof .\pprof.___3boss_api.exe.samples.cpu.001.pb.gz

 

在交互界面键入: svg 则会生成svg文件,点击打开即可

 

 

 

在交互式页面中,还有更多命令的支持, help查看

# 查看CPU消耗的前几位
topN

# 生成svg文件
svg

# 在浏览器中打开
web

 

 

 

 

常见问题:

1.在gin框架中使用pprof分析报,执行采样命令后报:profile duration exceeds server's WriteTimeout 

解决: 这是执行go tool pprof http://x.x.x.x:8000/debug/pprof/profile之后,会等待30s中,进行采样操作, 如果超过了框架设置的WriteTimeout时间的话,就会报这个错误, 可以调整该属性

 

 

更多使用:

 

posted @ 2023-08-08 08:41  X-Wolf  阅读(771)  评论(0编辑  收藏  举报