golang 性能调优分析工具 pprof (上) (2)

获取的 Profiling 数据是动态的,要想获得有效的数据,请保证应用处于较大的负载(比如正在生成中运行的服务,或者通过其他工具模拟访问压力)。否则如果应用处于空闲状态,得到的结果可能没有任何意义。
(后面会遇到这种问题)

分析数据,基本的模式有 2 种:

一个是命令行交互分析模式

一个是图形可视化分析模式

命令行交互分析

分析上面采集的数据,命令: go tool pprof democpu.pprof

golang 性能调优分析工具 pprof (上)

字段 说明
Type   分析类型,这里是 cpu  
Duration   程序执行的时长  

Duration 下面还有一行提示,这是交互模式(通过输入 help 获取帮助信息,输入 o 获取选项信息)。

可以看出,go 的 pprof 操作还有很多其他命令。

输入 help 命令,出来很多帮助信息:

golang 性能调优分析工具 pprof (上)

Commands 下有很多命令信息,text ,top 2个命令解释相同,输入这个 2 个看看:

输入 top,text 命令

top 命令:对函数的 cpu 耗时和百分比排序后输出

top后面还可以带参数,比如: top 15

golang 性能调优分析工具 pprof (上)

输出了相同的信息。

字段 说明
flat   当前函数占用 cpu 耗时  
flat %   当前函数占用 cpu 耗时百分比  
sum%   函数占用 cpu 时间累积占比,从小到大一直累积到 100%  
cum   当前函数加上调用当前函数的函数占用 cpu 的总耗时  
%cum   当前函数加上调用当前函数的函数占用 cpu 的总耗时占比  

从字段数据我们可以看出哪一个函数比较耗费时间,就可以对这个函数进一步分析。
分析用到的命令是 list 。

list 命令:可以列出函数最耗时的代码部分,格式:list 函数名

从上面采样数据可以分析出总耗时最长的函数是 main.cycylenum,用 list cyclenum 命令进行分析,如下图:

golang 性能调优分析工具 pprof (上)

发现最耗时的代码是 62 行:slice = append(slice, j) ,这里耗时有 1.47s ,可以对这个地方进行优化。

这里耗时的原因,应该是 slice 的实时扩容引起的。那我们空间换时间,固定 slice 的容量,make([]int, num * num)

可视化分析 A. pprof 图形可视化

除了上面的命令行交互分析,还可以用图形化来分析程序性能。

图形化分析前,先要安装 graphviz 软件,

下载地址:graphviz地址,

下载对应的平台安装包,安装完成后,把执行文件 bin 放入 Path 环境变量中,然后在终端输入 dot -version 命令查看是否安装成功。

生成可视化文件:

有 2 个步骤,根据上面采集的数据文件 democpu.pprof 来进行可视化:

命令行输入:go tool pprof democpu.pprof

输入 web 命令

在命令行里输入 web 命令,就可以生成一个 svg 格式的文件,用浏览器打开即可查看 svg 文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxzwp.html