1.摘要

本文讲解在Windows 10操作系统VS Code集成环境下,如何使用GO语言的PProf工具进行性能分析和查看的基本操作,同时也介绍火焰图呈现GO torch的使用入门指导。

这篇文章比较长,应该是目前PProf&GO torch整理最全的一篇了,把纲要在摘要处先列一下,各位客官各取所需。

2,介绍和环境准备

2.1 PProf介绍

go的pprof工具可以用来监测进程的运行数据,用于监控程序的性能,对内存使用和CPU使用的情况统信息进行分析。 官方提供了两个包:runtime/pprof和net/http/pprof,前者用于普通代码的性能分析,后者用于web服务器的性能分析。 PProf不需要独立安装,Go环境装好后即可引用启动了。

2.1.1 PProf功能

PProf工具可以做以下分析:

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置;
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏;
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置;
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况;

2.2 图形呈现辅助工具Graphviz

Graphviz (英文:Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的函式库。 需要图形化呈现PProf的分析结果,就需要安装Graphviz工具包。

2.2.1 下载安装包并安装

在官网目录下下载windows的安装包,并按照默认配置完成安装。 https://graphviz.gitlab.io/_pages/Download/Download_windows.html

2.2.2 配置环境变量

将graphviz安装目录下的bin文件夹添加到Path环境变量中:

C:Program Files (x86)Graphviz2.38bin

操作如下图:

2.2.3 验证安装成功

进入windows命令行界面,输入显示版本命令,如果显示graphviz的相关版本信息,则安装配置成功。

dot -version

操作如下图:

2.3 GO样例

(1) demo.go主程序

位置:$GOPATHsrcpprofDemodemo.go

(2) d.go

位置:$GOPATHsrcpprofDemodatademo.go

(3) 运行GO程序

在Windows的CMD命令行或者VS Code的终端命令行运行程序:

go run demo.go

程序结果:

3,通过WEB运行分析

在浏览器下输入以下地址运行PProf分析:

浏览器可呈现以下内容:

【说明】 debug=1时,会将函数地址转换为函数名,即脱离 pprof 在浏览器中直接查看。 对 goroutine CMD来说,还支持 debug=2,此时将以 unrecovered panic 的格式打印堆栈,可读性更高。

3.1 alloc - 内存分配情况

点击第一个链接 allocs 可以看到内容分配情况。

输出样例:

3.2 block - 导致阻塞同步的堆栈跟踪

点击第二个链接 0 | block获取导致阻塞的 goroutine 堆栈(如 channel, mutex 等)。

结果 - 不存在阻塞情况:

3.3 cmdline - 当前程序激活的命令行

点击 0 | cmdline获得当前程序激活的命令行启动参数。

结果:

3.4 goroutine - 当前运行的goroutine

点击 6 | goroutine 获得当前当前运行的goroutine的堆栈信息。

结果:

3.5 heap - 存活对象的内存分配情况

点击 | 23 | heap | 获得当前当前运行的goroutine跟踪。

结果:

3.7 mutex - 互斥锁的竞争持有者的堆栈跟踪

点击 | mutex | 导致互斥锁的竞争持有者的堆栈跟踪。

结果:

3.6 profile - 默认进行 30s 的 CPU Profiling

点击 profile 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。

结果: 得到一个分析用的 profile 文件,需要用后面的专用工具分析查看。

3.8 threadcreate - 操作系统线程跟踪

点击 | 7 | threadcreate 获得操作系统线程跟踪。

结果:

3.9 trace - 当前程序执行情况

点击 | 0 | trace | 获得当前程序的执行情况,

结果: 得到一个分析用的 trace 文件,需要用后面的专用工具分析查看。

3.10 full goroutine stack dump - 所有goroutine栈输出

点击full goroutine stack dump获得所有goroutine栈输出。 结果:

4. 通过交互式终端分析

4.1 时长为60s的CPU占用分析

程序运行情况下,命令行输入:

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

结果输出:

执行该命令后,需等待 60 秒(可调整 seconds 的值),pprof 会进行 CPU Profiling。结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help 查看命令说明。

4.1.1 top

top查看前10行数的CPU占用情况:

【说明】

  • flat:采样时,该函数正在运行的次数*采样频率(10ms),即得到估算的函数运行”采样时间”。这里不包括函数等待子函数返回;
  • flat%:同上的 CPU 运行耗时总比例;
  • sum%:给定函数累积使用 CPU 总比例,如第二行 sum% = 89.72% = 88.90% + 0.83%
  • cum:当前函数加上它之上的调用运行总耗时,包括函数等待子函数返回。因此 flat <= cum;
  • cum%:同上的 CPU 运行耗时总比例
  • 最后一列为函数名称;
4.1.2 tree

树形结构查看goroutine情况。

4.1.3 exit

退出分析,输入exit命令。

4.2 heap堆分析

输出结果:

输入top,可以得知所有栈内存被.Add函数占有,合计410M。

4.3 stack栈分析

输出结果:

go tool pprof -alloc_objects http://localhost:6060/debug/pprof/heap

4.4 其他

5. PProf 可视化界面

【说明】 -http=:8080 表示启动PProf 可视化界面。默认情况下,会浏览器打开输出图形界面。

例如:

【常见问题1】Could not execute dot; may need to install graphviz.

【原因】说明没有安装 graphviz 。请参考2.2完成Graphviz安装。

【常见问题2】open cpu.prof: The system cannot find the file specified

【场景】运行命令,以便图形化界面输出。

go tool pprof -http=:8080 cpu.prof

【原因】辉哥在windows下遇到的问题,丁恒在MAC下并没有遇到。后来我分析,需要先输出.prof文件,然后使用图形化查看即可。 例如以下命令即可呈现CPU占用的图形化界面分析。

go tool pprof -http=:8080 C:Usersddpprofpprof.samples.cpu.005.pb.gz

6. go-torch火焰图生成工具

go-torch是Uber公司开源的一款针对Golang程序的火焰图生成工具,能收集 stack traces,并把它们整理成火焰图,直观地程序给开发人员。go-torch是基于使用BrendanGregg创建的火焰图工具生成直观的图像,很方便地分析Go的各个方法所占用的CPU的时间。 go-torch命令的帮助说明如下:

6.1 安装go-torch

WINDOWS命令行安装go-torch:

go get github.com/uber/go-torch

然后进入go-torch安装目录,安装FlameGraph。例如:

cd D:jusanbandoc50-编码实现GOsrcgithub.comubergo-torch git clone https://github.com/brendangregg/FlameGraph.git

然后将FlameGraph路径添加到Path环境变量中。

D:jusanbandoc50-编码实现GOsrcgithub.comubergo-torchFlameGraph

6.2 下载安装 Perl ,用于执行 .pl 文件

要执行.pl文件,需要安装 Perl 语言的运行环境,windows 10 安装 ActivePerl。 从官网或者百度网盘直接下载源程序按照默认设置完成安装。 https://pan.baidu.com/s/107UTzX-9_vgFPTW93Ec3AA

检查是否按照成功

命令行输入perl -v即可检查是否已经安装成功。

【常见问题3】0mFailed: could not generate flame graph

【问题现象】

【原因及解决方法】 生不出火焰图,原因为flamegraph.pl不是有效的可执行文件。在WINDOWS下,需要安装perl才能执行这个文件呢。

6.3 生成并分析火焰图

命令含输入

结果:

在浏览器下打开生成的cpu-local.svg文件,可以看到火焰图情况。

【火焰图分析】

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

7. 高性能程序建议

以下是一些从其它项目借鉴或者自己总结的实践经验,它们只是建议,而不是准则,实际项目中应该以性能分析数据来作为优化的参考,避免过早优化。

-race
8.参考

(1)Go学习之路-代码性能监控pprof https://www.jianshu.com/p/60c0c178212a 【点评】丁恒输出,有实践内容。

(4)Golang 大杀器之性能剖析 PProf https://segmentfault.com/a/1190000016412013

(5)golang pprof 实战 https://blog.wolfogre.com/posts/go-ppof-practice/ 【点评】整理得不错。

(6)使用pprof分析cpu占用过高问题 https://studygolang.com/articles/21841 【点评】CPU占用过高样例分析

(7)Golang性能测试工具PProf应用详解 https://studygolang.com/articles/19024?fr=sidebar

(11)golang 使用pprof和go-torch做性能分析 -- Windows https://www.jianshu.com/p/a22174de24c7

(12)windows 10 下载安装 Perl ,用于执行 .pl 文件。 https://www.jianshu.com/p/e0d593217756