go基础第二篇:利用pprof定位cpu和内存问题
在项目的main.go文件中引入
_ "net/http/pprof"
在main函数中加入:
go func() {
_ = http.ListenAndServe(":6060", nil)
}()
保证6060端口能访问到,如在容器中部署的话,别忘了添加端口映射。如果有防火墙的话,别忘了放开端口访问。
查看cpu使用情况:
go tool pprof -http :9090 http://${ip}:${port}/debug/pprof/profile
${ip}值是进程所在服务器的ip,${port}值是进程监听的端口,即上面配置的6060。
如上,如果使用了-http选项指定host和port的话,等待30s之后,会自动打开浏览器访问localhost:9090/ui/,这个是pprof的web ui。
点击右上角的超链接,我们可以看到取样时间是多少。我们可以通过耗时的分布,看出哪些函数占用cpu时间长。
点击view菜单的top菜单,会按照cpu使用时间降序排列。点击graph菜单,会展示图,这也是首次进入打开的页面。点击flame graph菜单,就会出所谓的火焰图。点击peek菜单,不仅可以展示按降序排列的cpu使用,还会看到调用栈。
查看内存使用情况:
go tool pprof -http :9090 http://${ip}:${port}/debug/pprof/heap
同样会自动打开浏览器访问localhost:9090/ui/,但不会等待30s,而是马上就跳转。