这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
本次笔记将插入pprof的性能分析工具的使用,由于某种原因导致我一直运行不了pprof的demo,所以拖到今天才记录
获得demo
-
可以从 github.com/wolfogre/go… 下载code到gopath下
-
也可以直接用控制台扒下来
git clone https://github.com/wolfogre/go-pprof-practice
运行项目
至于我单独列出运行项目,是因为前段时间正好被这卡着,一开始总是运行失败。百度半天也没有什么解决办法。
- 正常运行的结果是如下图
控制台疯狂打印这些动物的行为
- 但是,我一开始却是10000000000不属于int类型overflows的错误
于是去掉了几个0以后再编译出现出现out of memory的错误提示
- 原因 搜了几天都没头绪,最后在CSDN提问了关于运行Kitex的demo后控制台直接报 overflows uintptr的错误,一位字节的大大告诉我说是系统64位与32位的问题。
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/ ,虽然可读性不高,但至少可读
CPU
在任务管理器看看程序的cpu占用
峰值占了我将近20%的CPU 终端输入:go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10" 以获取文件
现在终端就是pprof的工具使用了
top
用于查看占用资源最多的函数
-
flat: 当前函数本身的执行耗时 -
flat%:flat占CPU总时间的比例 -
sum%: 上面每一行的flat%总和 -
cum: 当前函数本身加上其周期函数的总耗时 -
cum%:cum占CPU总时间的比例Flat == Cum:说明函数中没有调用其他函数 Flat == 0:说明函数中只有其他函数的调用
list
根据指定的正则表达式查找对应代码行
例如,找出上面占用最多的Eat函数,list Eat
得到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。(这里需要科学上网)
heap
另起一个终端,以可视化查看堆内存的情况
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
得知是mouse的Steal方法占用大量内存
打开View->Source视图,以获得具体的代码文件以及对应的行数。
goroutine
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
终端输入上面代码得到火焰图
火焰图说明:
- 由上到下标识调用顺序
- 每一块代表一个函数,越长代表占用CPU时间更长
- 火焰图是动态的,支持点击块进行分析
mutex
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
block
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
通过pprof能够查出性能消耗较大的代码位置,最后开发者根据对应位置实施代码优化