由于 Go 语言内置了对 pprof 的支持,因此无需额外安装其它依赖,只需要在程序入口处引入相关包,并且启动一个服务即可
package main
import (
"net/http"
_ "net/http/pprof"
// ...
)
func main() {
go func() {
// pprof 服务器,将暴露在 6060 端口
if err := http.ListenAndServe(":6060", nil); err != nil {
panic(err)
}
}()
// ...
}
在本地运行程序,打开 http://localhost:6060/debug/pprof/,将看到如下界面:
各项数据,参数如下:
- CPU 分析(profile): 可以在 url 上用 seconds 参数指定抽样持续时间(默认 30s),获取到概览文件后可以用 go tool pprof 命令调查这个概览
- 内存分配(allocs): 所有内存分配的抽样
- 阻塞(block): 堆栈跟踪导致阻塞的同步原语
- 命令行调用(cmdline): 命令行调用的程序
- goroutine: 当前 goroutine 的堆栈信息
- 堆(heap): 当前活动对象内存分配的抽样,完全也可以指定 gc 参数在对堆取样前执行 GC
- 互斥锁(mutex): 堆栈跟踪竞争状态互斥锁的持有者
- 系统线程的创建(threadcreate): 堆栈跟踪系统新线程的创建
- trace: 追踪当前程序的执行状况. 可以用 seconds 参数指定抽样持续时间. 获取到 trace 概览后可以用 go tool pprof 命令调查这个 trace
pprof命令行工具:
pprof 是 golang 官方提供的性能调优分析工具,可以对程序进行性能分析,并可视化数据,当 go 程序遇到性能瓶颈时,可以使用这个工具来进行调试并优化程序。
程序运行后,打开一个终端环境,输入 go tool pprof http://localhost:6060/debug/pprof/allocs
常见命令:
top:列出当前资源的占用情况,默认会按照资源占用率从高到低;
其中:flat:函数内所有直接语句的时间或内存消耗;
cum:函数内所有直接语句,以及其调用的子函数的时间或内存消耗;
sum:没有在文档中找到对应解释,但是通过观察可以发现,它是 flat% 的累加值。
list 函数名: 通过前面top查看想看的函数,定位到具体的代码位置(正则匹配)
web: 可视化分析,需要安装 Graphviz 工具,macOS推荐源码安装
其中有各种试图:top视图、source视图、火焰图等等
其中关于web:
可以通过
go tool pprof -http=:8888 http://localhost:6060/debug/pprof/xxx命令
直接打开想看的东西,其中xxx为:
1. heap:分析展示堆内存占用
2. goroutine:展示协程创建使用情况
3. mutex:锁使用情况
4. block:阻塞情况