定位最大瓶颈而不是细枝末节,不要过早过度优化
引用工具
_ "net/http/pprof"
//在代码中,需要调用一个协程取监听6060端口, 上面引入包时会自动注册pprof的handler到http server
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
保持程序运行并打开这个网址,可以大致查看指标http://localhost:6060/debug/pprof/
其中:
- allocs:查看过去所有内存分配的样本(历史累计)。
- block:查看导致阻塞同步的堆栈跟踪(历史累计)。
- cmdline: 当前程序的命令行的完整调用路径(从程序一开始运行时决定)。
- goroutine:查看当前所有运行的 goroutines 堆栈跟踪(实时变化)。
- heap:查看活动对象的内存分配情况(实时变化)。
- mutex:查看导致互斥锁的竞争持有者的堆栈跟踪(历史累计)。
- profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件(从开始分析,到分析结束)。
- threadcreate:查看创建新 OS 线程的堆栈跟踪(一般没啥用)。
- trace:mp.weixin.qq.com/s/I9xSMxy32…
注意,默认情况下是不追踪block和mutex的信息的 上文的所有信息都是实时的,如果你刷新一下,是可以看到数字在变化的。此时如果点击蓝色的连接,可以看到一些协程的栈信息,这些信息并不容易阅读。如果想要更加清晰的数据,需要将信息保存下来,在本地进行分析。
这里有一个小点要注意,在这个页面下,点击profile和trace总是会下载文件。而点击其他链接会跳转到另一个页面,来展示一些数据,但是可读性也比较差。
如果点击profile,程序会开始进行半分钟(默认值)的CPU采样,然后才会下载文件。
输入go tool pprof http://localhost:6060/debug/pprof/profile命令,可以查看CPU占用数据
输入top命令,查看 CPU 占用较高的调用,
调用最高是Eat,注意, runtime.***和main.***属于由调用的Eat引起的,不是造成CPU占用的原因, 输入
list Eat
可以查看详细情况
排查内存占用过高
go tool pprof http://localhost:6060/debug/pprof/heap
排查频繁内存回收
go tool pprof http://localhost:6060/debug/pprof/allocs
排查协程泄露
go tool pprof http://localhost:6060/debug/pprof/goroutine
排查锁的争用
go tool pprof http://localhost:6060/debug/pprof/mutex
排查阻塞操作
go tool pprof http://localhost:6060/debug/pprof/block
也可以通过这条命令,输入网址localhost:8080可视化查看
go tool pprof -http=:8000 http://127.0.0.1:6060/debug/pprof/profile
go tool pprof -http=:8000 cpu.out
go tool pprof -http=:8000 pprof.XXX.samples.cpu.001.pb.gz
这将会启动一个web服务器,并自动打开一个网页。这个网页最上方有一个header,我们可以切换到火焰图、top、连线图。