性能调优实战 | 青训营

110 阅读3分钟

性能调优实战

性能调优实战工具pprof

pprof 是用于可视化和分析性能分析数据的工具。pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)

下载源码,并运行着main.go。

根据本地ID 浏览器查看指标

image.png

里面有我们可用的一些程序运行数据,每个指标也有对应说明

点进去看到把一些数据平铺了

image.png

主要重点介绍以下几点对程序性能的影响

  • allocs 内存
  • block 阻塞
  • heap
  • mutex 锁
  • profile

cpu占用情况

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

image.png

top

  • flat:当前函数本身的执行耗时
  • flat%:flat占cpu总时间的耗时
  • sum%:上面每一行的flat%总和
  • cum:指当前函数本身加上其调用函数的总耗时
  • cum%:cum占cpu总时间的比例

image.png

从图可以看出tiger.(*Tiger) 函数占用最多的cpu资源,我们接着查询此操作

  • Flat==cum?函数中没有调用其他函数
  • Flat==0?函数中只有其他函数的调用

list eat:能查找函数看具体哪里出现问题

image.png

能看到消耗性能最大的代码所在处,可以看到是循环处。

在终端用命令看不清楚,可以用web命令在浏览器查看

可以注释代码再重新运行,看cpu占用情况。

heap-堆内存

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

让我们再来看一下堆内存heap的问题

image.png

出现我们没有安装 graphviz的提示,故需要我们安装一下

补充:安装graphviz

在官网下载:www.graphviz.org/download/

一直默认下一步即可,要记住下载路径。

编辑环境变量,在系统变量里添加graphviz路径下bin文件夹地址。

打开我们的cmd窗口,输入dot -version命令。

当显示版本号时,代表我们安装成功,如下图所示

image.png

安装完毕,需要重启一下我们的VSCode,让我们再次运行main.go,并输入go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" 命令 ,可以看到我们的可视化网页被正常打开。

image.png

框越大,线越粗代表占用的时间越大。

其中view选项卡有很多选项,支持我们很多图的展示。 如TOP显示占用最多的,graph图,flame graph火焰图等。

image.png

打开TOP视图为:

image.png

Flame graph视图:

image.png

把代码注释掉,也可以重新看下我们内存占比。

一些指标说明:

  • inuse_objects:程序当前持有的对象数
  • inuse_space:程序当前占用的内存大小
  • alloc_objects:程序累计申请的对象数
  • alloc-space:程序累计申请的内存大小

goroutine-协程

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

打开火焰图

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

image.png

可以再在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"

小结

image.png

性能调优实战工具pprof-采样过程和原理

cpu采样

image.png

image.png

heap-堆内存采样

image.png

Goroutine协程采样和ThreadCreate创建

image.png

Block-阻塞 Mutex-锁

image.png