性能调优实战
性能调优实战工具pprof
pprof 是用于可视化和分析性能分析数据的工具。pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)
下载源码,并运行着main.go。
根据本地ID 浏览器查看指标
里面有我们可用的一些程序运行数据,每个指标也有对应说明
点进去看到把一些数据平铺了
主要重点介绍以下几点对程序性能的影响
- allocs 内存
- block 阻塞
- heap
- mutex 锁
- profile
cpu占用情况
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
top
- flat:当前函数本身的执行耗时
- flat%:flat占cpu总时间的耗时
- sum%:上面每一行的flat%总和
- cum:指当前函数本身加上其调用函数的总耗时
- cum%:cum占cpu总时间的比例
从图可以看出tiger.(*Tiger) 函数占用最多的cpu资源,我们接着查询此操作
- Flat==cum?函数中没有调用其他函数
- Flat==0?函数中只有其他函数的调用
list eat:能查找函数看具体哪里出现问题
能看到消耗性能最大的代码所在处,可以看到是循环处。
在终端用命令看不清楚,可以用web命令在浏览器查看
可以注释代码再重新运行,看cpu占用情况。
heap-堆内存
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
让我们再来看一下堆内存heap的问题
出现我们没有安装 graphviz的提示,故需要我们安装一下
补充:安装graphviz
在官网下载:www.graphviz.org/download/
一直默认下一步即可,要记住下载路径。
编辑环境变量,在系统变量里添加graphviz路径下bin文件夹地址。
打开我们的cmd窗口,输入dot -version命令。
当显示版本号时,代表我们安装成功,如下图所示
安装完毕,需要重启一下我们的VSCode,让我们再次运行main.go,并输入go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
命令 ,可以看到我们的可视化网页被正常打开。
框越大,线越粗代表占用的时间越大。
其中view选项卡有很多选项,支持我们很多图的展示。 如TOP显示占用最多的,graph图,flame graph火焰图等。
打开TOP视图为:
Flame graph视图:
把代码注释掉,也可以重新看下我们内存占比。
一些指标说明:
- inuse_objects:程序当前持有的对象数
- inuse_space:程序当前占用的内存大小
- alloc_objects:程序累计申请的对象数
- alloc-space:程序累计申请的内存大小
goroutine-协程
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
打开火焰图
- 由上到下表示调用顺序
- 每一块代表一个函数,越长代表占用cpu的时间更长
- 火焰图是动态的,支持点击块进行分析
可以再在source视图里搜占比最大的wolf
相关代码注释后,可以看到协程数大幅度下降。
mutex-锁
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/motex"
与前面流程一致可以查看情况
block-阻塞
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"