获取的 Profiling 数据是动态的,要想获得有效的数据,请保证应用处于较大的负载(比如正在生成中运行的服务,或者通过其他工具模拟访问压力)。否则如果应用处于空闲状态,得到的结果可能没有任何意义。
(后面会遇到这种问题)
分析数据,基本的模式有 2 种:
一个是命令行交互分析模式
一个是图形可视化分析模式
命令行交互分析分析上面采集的数据,命令: go tool pprof democpu.pprof
字段 说明Type: 分析类型,这里是 cpu
Duration: 程序执行的时长
Duration 下面还有一行提示,这是交互模式(通过输入 help 获取帮助信息,输入 o 获取选项信息)。
可以看出,go 的 pprof 操作还有很多其他命令。
输入 help 命令,出来很多帮助信息:
Commands 下有很多命令信息,text ,top 2个命令解释相同,输入这个 2 个看看:
输入 top,text 命令
top 命令:对函数的 cpu 耗时和百分比排序后输出
top后面还可以带参数,比如: top 15
输出了相同的信息。
字段 说明flat 当前函数占用 cpu 耗时
flat % 当前函数占用 cpu 耗时百分比
sum% 函数占用 cpu 时间累积占比,从小到大一直累积到 100%
cum 当前函数加上调用当前函数的函数占用 cpu 的总耗时
%cum 当前函数加上调用当前函数的函数占用 cpu 的总耗时占比
从字段数据我们可以看出哪一个函数比较耗费时间,就可以对这个函数进一步分析。
分析用到的命令是 list 。
list 命令:可以列出函数最耗时的代码部分,格式:list 函数名
从上面采样数据可以分析出总耗时最长的函数是 main.cycylenum,用 list cyclenum 命令进行分析,如下图:
发现最耗时的代码是 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 文件。