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时间的话,就会报这个错误, 可以调整该属性
更多使用: