什么是pprof
pprof是Go官方提供的性能分析工具,可以分析程序的运行情况,并且提供可视化的功能。
pprof可以分析什么
- allocs:程序启动之后内存分配的情况
- block:导致阻塞操作的一些堆栈跟踪信息
- cmdline:当前程序启动的命令行
- goroutine:所有当前 goroutine 的堆栈跟踪信息
- heap:程序在当前堆上内存分配的情况
- mutex:锁资源的竞争的堆栈信息
- profile:CPU profile文件。可以在 debug/pprof?seconds=x秒 GET 参数中指定持续时间。获取pprof文件后,使用 go tool pprof x.prof命令分析pprof文件。
- threadcreate:系统线程的使用情况
- trace:当前系统的代码执行的链路情况
如何使用
代码中引用包
从main函数中引用包 _ "net/http/pprof"
_ "net/http/pprof"
创建新的协程来启动pprof服务
func RegisterProf() {
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
panic("pprof server start error: " + err.Error())
}
}()
}
启动服务访问协程定义的6060端口 debug/pprof
localhost:6060/debug/pprof
使用go tool pprof 命令查看分析
打开命令行工具 输入go 自带的go tool命令
go tool pprof + 复制分析模块链接
go tool pprof http://127.0.0.1:6060/debug/pprof/allocs
进入交互
通过top +num 来查看占用最多的几条
通过 list 加关键信息查看具体情况
安装graphviz查看线图
下载graphviz
下载网址:https://graphviz.gitlab.io/download/
下载完记得添加到全局环境变量,不然无法找到dot命令
在pprof中通过web来唤醒
按照函数栈的方式向下
分析高内存占用,互斥锁,多协程,高CPU产生原因
通过上述使用 可以通过 go tool pprof +localhost:6060/debug/pprof/ + allocs || block || heap || goroutine 等 针对不对模块进行分析
通过top 找到占用高的地方+通过list +关键词来确定代码具体方位 进行原因分析