pprof 是一个强大的性能分析工具,可以捕捉到多维度的运行状态的数据,能够非常方便的监控代码运行性能。
性能分析基础数据的获取有三种方式:
- runtime/pprof 包
- net/http/pprof 包
- go test 时添加收集参数
性能调优的两个方向:CPU和内存
-
go tool pprof cpu.pprof
-
go tool pprof mem.pprof
runtime/pprof 包的使用[不推荐使用]
针对于应用程序,通过命令行的启动参数来生成prof文件,再使用go tool pprof工具进行分析,如
运行 https://blog.csdn.net/qq_45066628/article/details/app.exe -cpuprofile=cpu.prof
分析 go tool pprof cpu.prof
注意,实际测试时得到的cpu.prof文件总是为空,原因未知
net/http/pprof 包的使用[推荐]
net/http/pprof 对 runtime/pprof 进行了封装,并在http端口上暴露出来,入口为 IP:PORT/debug/pprof/
a>若应用为web服务器,只需引入包即可 _ “net/http/pprof”,会自动注册路由到/debug/pprof/
b>若为服务时程,可开启一个goroutine开启端口并监听,如
go func(){log.Println(http.ListenAndServe(":8080",nil))}()
访问 http://127.0.0.1:8080/debug/pprof/ 即可实时查看性能数据,业面如下:
其中 go tool trace 工具会打开 http://127.0.0.1:1089/ 通过网页方式显示结果
go test 时添加收集参数
需要创建测试文件
go test支持的参数非常多,如
-cpuprofile=cpu.prof
-memprofile=mem.prof
对生成的profile文件,可使用go tool pprof profilename来分析,如
常用的命令还有:
在 go tool pprof 下输入 web 命令,注意默认端口为8080
注意,需要提前安装 Graphviz 用于画图
下载地址:https://graphviz.gitlab.io/download/
windows:https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.zip
解压下,添加环境变量 Path下添加 C:Gographvizbin (这里我解压在 C:Gographviz 目录)
测试:命令提示符下 dot -V # 打印版本信息
若是Linux,yum install graphviz # 默认安装版本为为2.30 依赖项较多
访问地址:http://localhost:8000/ui/
在正常程序中,添加 go NewMonitor(1) 每隔指定时间在控制台输出性能数据
此外,内置包 expvar 可以在/debug/vars 中输出cmdline、memstats的json数据,若要向其中添加输出内容,如输出 num_goroutine 用于显示协程数量,核心语句如下:
详细参考:https://github.com/qcrao/Go-Questions/blob/master/GC/GC.md
方式1:GODEBUG=gctrace=1
go build -o main
GODEBUG=gctrace=1 https://blog.csdn.net/qq_45066628/article/details/main
方式2:go tool trace
在代码中添加:
f, _ := os.Create(“trace.out”)
defer f.Close()
trace.Start(f)
defer trace.Stop()
然后运行程序,等程序运行完成,执行以下命令
go tool trace trace.out
需要等到程序执行完成 需要使用chrome浏览器(实测firefox有问题)