零基础之go语言11(pprof运行失败的同学看过来) | 青训营笔记

85 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

本次笔记将插入pprof的性能分析工具的使用,由于某种原因导致我一直运行不了pprof的demo,所以拖到今天才记录

获得demo

  • 可以从 github.com/wolfogre/go… 下载code到gopath下

  • 也可以直接用控制台扒下来

      git clone https://github.com/wolfogre/go-pprof-practice
    

运行项目

至于我单独列出运行项目,是因为前段时间正好被这卡着,一开始总是运行失败。百度半天也没有什么解决办法。

  • 正常运行的结果是如下图

image.png

控制台疯狂打印这些动物的行为

  • 但是,我一开始却是10000000000不属于int类型overflows的错误

image.png

于是去掉了几个0以后再编译出现出现out of memory的错误提示

d8fc4215a32562858b053c22a0a7d7c.png

GO语言中int类型的大小是不确定的,与具体的平台有关系一般来说,int在32位系统中是4字节,在64位系统中是8字节。 他建议我换一个64位的电脑运行一下就行了,可是我的电脑本身就有64位,这是为什么呢。既然电脑是64位的系统,但是运行的时候却用的是32位,那就一定是我的GoLang安装成32位的了!

果然,go envision发现我的版本是go1.18.10.windows-386,这个是专门给32位系统用的。而本次的pprof demon是需要支持64位的GoLang(go1.18.10.windows-amd64)去运行,替换以后果然都能正常运行了(开心)!

正如那位大大所说,go语言与java是不同的,java的int永远是4个字节,而go支持的不同版本内的int是不一样的,支持32位系统的go版本的int是4字节,而支持64系统的go版本的int却是8字节。

为大家提供了类似错误的一个解决方法,帮助到你的话点个赞叭~

查看性能

真好,运行成功以后我们可以直接打开网址 http://localhost:6060/debug/pprof/ ,虽然可读性不高,但至少可读

image.png

CPU

在任务管理器看看程序的cpu占用

image.png

峰值占了我将近20%的CPU 终端输入:go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10" 以获取文件

现在终端就是pprof的工具使用了

image.png

top

用于查看占用资源最多的函数

image.png

  • flat: 当前函数本身的执行耗时

  • flat%flatCPU总时间的比例

  • sum%: 上面每一行的flat%总和

  • cum: 当前函数本身加上其周期函数的总耗时

  • cum%: cumCPU总时间的比例

    Flat == Cum:说明函数中没有调用其他函数
    Flat == 0:说明函数中只有其他函数的调用
    

list

根据指定的正则表达式查找对应代码行

例如,找出上面占用最多的Eat函数,list Eat

image.png

得到tiger的Eat在26-31行,而dog的在19-29行

web

输入web可生成可视化文件

如果报错:Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%
请到www.graphviz.org/download/下载Graphviz, 并配置到环境变量中,将bin目录配置到PATH。(这里需要科学上网)

image.png

heap

另起一个终端,以可视化查看堆内存的情况

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"

image.png

得知是mouse的Steal方法占用大量内存

打开View->Source视图,以获得具体的代码文件以及对应的行数。

goroutine

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

终端输入上面代码得到火焰图
image.png

image.png

火焰图说明:

  • 由上到下标识调用顺序
  • 每一块代表一个函数,越长代表占用CPU时间更长
  • 火焰图是动态的,支持点击块进行分析

mutex

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"

image.png

block

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"

image.png


通过pprof能够查出性能消耗较大的代码位置,最后开发者根据对应位置实施代码优化