本文讲解在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占用的图形化界面分析。
6. go-torch火焰图生成工具go tool pprof -http=:8080 C:Usersddpprofpprof.samples.cpu.005.pb.gz
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