go build 无文件_Go学习_30_Golang代码性能分析工具
Golang内置了一些性能分析工具,可以将性能分析的结果文件输出,我们可以使用图形化的工具查看分析结果,在使用这些工具之前,我们需要安装一些工具,以便于查看分析文件。
为了支持查看图形化分析结果,首先需要安装graphviz工具:
brew install graphviz
为了方便调用Golang的分析工具,我们需要将$GOPATH/bin加入到$PATH中去:
在Windows中通过环境变量设置
在Mac下,通过vim ~/.bash_profile打开设置文件,添加配置如下:
uber提供了go-torch工具可以将分析结果文件以火焰图的方式进行展示,在go1.11之后的版本中go-torch被内置到了golang中,当然要是本地没有go-torch工具,可以通过以下步骤安装go-torch工具:
1. 安装go-torch
go get github.com/uber/go-torch
2. 下载并复制flamegraph.pl(可在https://github.com/brendangregg/FlameGraph下载)文件到$GOPATH/bin路径下。
golang通过将性能测试文件输出的方式给出性能测试的结果,我们可以通过go tool查看性能分析文件。
当我们想要对特定代码片段进行性能分析的时候,可以手动调用runtime/pprof下的API进行性能分析,runtime/pprof的API文档:
https://studygolang.com/pkgdoc
下面我们通过runtime.pprof对一段二维数组操作的代码片段进行性能检测:
首先是对二维数据的两个操作函数:
分别对二维数组进行随机填充,并对二维数组的每一行进行加和操作。
然后编写使用runtime.pprof对目标代码片段的测试代码:
【代码说明】
1. CPUProfile测试代码需要放在待测试代码片段的前面,调用pprof.StartCPUProfile()函数开启pprof测试,我们知道golang的函数在执行完所有的代码之后,会调用函数内部定义的defer函数,所以在此处的defer函数中调用一下pprof.StopCPUProfile()来结束本次测试;
defer func() { pprof.StopCPUProfile()}()// 也可以简写成defer pprof.StopCPUProfile()
2. 上面代码中,在待测试代码的后面有两段性能信息导出代码(堆栈信息导出、协程信息导出),这两部分的代码负责将pprof测试信息中的指标导出到profile文件中,所以要放在待测试代码片段的后面执行;
3. 上面代码中导出协程信息使用了pprof.Lookup(flagTag)函数,要是想要导出其他的性能flag信息,只需要给pprof.Lookup()函数传入不同的flag,支持的flag可以从下面的文件中查看:
https://golang.org/src/runtime/pprof/pprof.go
编写好性能测试代码之后,我们就可以对待测试代码进行性能检测了,检测的步骤:
(1)build源代码文件生成可运行的二进制文件:
go build main.go
可以看到生成了一个可执行的二进制文件:
(2)运行二进制文件生成性能测试文件:
可以看到输出了3个profile文件。
(3)查看profile文件,首先查看一下cpu.prof文件:
// 命令:go tool pprof go tool pprof main cpu.prof
运行上面的命令之后,就会进入pprof的交互控制台:
使用top命令查看cpu使用情况:
上图中我们可以看到本次此时过程中各个函数执行的情况,比如main函数中的fillMatrix执行的时间占了总执行时间的97.61%,花费了2450ms。
我们还可以通过list funcName来查看指定函数具体的耗时情况:
list fillMatrix命令为我们打印出了fillMatrix函数中耗时最长的是二维数组的赋值。
同样的golang还允许我们以图形化的方式查看函数的耗时情况,使用svg命令可以将所有函数运行情况以svg格式输出:
当我们想要退出pprof工具的时候,可以使用exit命令:
我们可以将该svg图拖拽到浏览器中查看:
上图中红色矩形越大的表示CPU耗时越长,箭头表示整个程序执行的顺序关系。
下面我们使用go-torch查看一下函数执行情况的火炬图,首先使用go-torch命令生成火炬图的:
上面的命令生成了一张torch.svg的图片文件,我们将其拖拽到浏览器中进行查看:
将光标指向不同的火焰柱状图可以查看到不同函数执行是消耗的CPU时间情况。
同样的我们也可以使用命令查看mem.prof中各个函数在执行的过程中对内存的占用情况:
go tool pprof main mem.prof
上图中我们可以看到二维数据占用了绝大多数的内存。
在性能测试的过程中,有时候我们需要查看一下我们的变量在系统发生GC之后,垃圾变量是否可以被成功的回收,我们可以在输出mem.prof文件内容之前,手动触发一次GC:
按照上面的命令,重新build二进制文件,并运行新的二进制文件,生成mem.prof文件,并进行查看:
我们发现在触发了GC之后,内存占用明显的降低了,从之前的1.49G降低到了1.72M,说明我们声明的变量是GC友好的,可以被系统成功的回收。
上面的测试方式适合我们在开发的过程中对代码片段进行性能检测,而对于线上运行的代码,我们不可能让线上程序一直输出测试文件,这样会影响到线上业务,不过pprof同样提供了线上代码性能测试的方法,运行我们通过http请求对线上任务进行一定时长的采样。
使用pprof对线上业务进行性能采样的步骤和要求:
在应用程序中导入 "net/http/pprof"的包,并启动http server
通过http://:/debug/pprof访问目标服务器
使用下面的命令开始对线上业务进行采样
// pprof进行采样// seconds参数可以指定采样时长,默认采样时间30sgo tool pprof http://:/debug/pprof/profile?seconds=10// 同样可以使用go-torch进行线上采样生成火焰图go-torch -seconds 10 http://:/debug/pprof/profile
在gin框架中使用pprof进行性能数据采样测试
为了测试pprof和go-torch对线上代码性能的测试,下面首先使用gin框架搭建一个简单的http服务:
该Http服务提供了两个访问接口,/ 和 /fb,后者循环生成多次斐波那契数列。我们直到使用pprof对线上业务进行性能采样测试的时候,必须启动一个golang内置的http server,那么我们通过gin框架也可以满足这个条件吗?我们查看gin的Run(listenPort)源码:
从上面的gin源码可以看到gin的Run函数内部其实也是使用http包进行Http Server的启动。其实不止gin框架,我们常用的beego和iris框架,追踪源码我们会发现,它们也是通过http包启动server服务的,因此当我们使用这些框架进行http server开发,同样可以使用pprof进行线上业务的采样测试。但是在正式使用pprof对gin框架的http server进行测试之前,我们还需要安装gin对pprof的封装包:
go get github.com/DeanThompson/ginpprof
并在程序中开启ginpprof服务,如上图代码中。
编写完gin的服务器之后,我们通过命令启动http服务:
在浏览器中进行访问:
服务启动成功。
请求连接就可以看到下面的测试网页:
点击就可以查看到不同的测试数据。
我们也可以通过命令行进行性能数据的采样:
上面进行了20s的性能数据采样,当采样结束之后,命令行会自动进入pprof交互模式,这时我们就可以通过命令进行文件查看了:
同样的也可以通过go-torch进行采样分析:
同样的,在指定的采样时间结束之后,go-torch就会结束采样,并将svg的文件输出到命令行文件目录下,我们可以在本地找到这个torch.svg文件,并将其拖拽到浏览器中查看:
在iris框架下使用pprof进行性能数据的采样测试
和gin框架一样,我们首先需要搭建一个iris的http服务(下面使用了v12版本的iris):
和golang内置的http server以及gin框架有所不同,iris下使用pprof工具,我们需要手动添加两个访问接口,添加完上述代码之后,运行iris服务:
go run main.go
在浏览器中测试访问接口:
服务启动成功。
同样的我们可以通过url来查看pprof的性能数据:
通过命令行来查看pprof采样数据:
go tool pprof http://127.0.0.1:8081/debug/pprof/heap?seconds=10
在命令行中输入上面的请求,会采样最近10s内线上服务堆栈使用的情况,在输入命令之后,会立即dump并进入到pprof的交互控制台(这和查看profile不太一样):
查看一下iris的middleware/pprof包中的New方法,从源码我们可以看到,iris内部也是使用了golang内置的net/http/pprof进行性能数据的采样,除了profile和heap,我们还可以查看的数据指标也可以从源码中看到:
同样的使用go-torch对性能数据进行采样并输出火焰图:
将火焰图拖拽到浏览器中查看:
go build 无文件_Go学习_30_Golang代码性能分析工具相关推荐
- .NET 11 个 Visual Studio 代码性能分析工具
原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- 11 个 Visual Studio 代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- Windows phone 7应用之代码性能分析工具——Profile.
前端时间断断续续的写了几篇关于Windows phone 7本地数据库访问文章. 最近在Window phone 7 APPStore上注册Apphub账号看到很多很有意思的小应用, 也结识几个专职做 ...
- cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark
Golang的testing包中除了单元测试testing.T之外,还提供了testing.B的Benchmark性能测试,Benchmark测试主要是通过测试CPU和内存的效率,来评估测试代码的性能 ...
- go build 无文件_Go 质量保证:集成测试(1) 用 Docker 执行测试
点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 简介 "测试会带来失败,而失败会带来理解." -- Burt Rutan Burt ...
- go build 无文件_GO笔记之详解GO的编译执行流程
上篇文章介绍了Golang在不同系统下的安装,并完成了经典的Hello World案例.在这个过程中,我们用到了go run命令,它完成源码从编译到执行的整个过程. 今天来详细介绍下这个过程.简单理解 ...
- go build 无文件_Go之Gin+Vue开发一个线上外卖应用
我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户端和服务端 ...
- Python之代码性能分析工具(时间+内存)
原文链接:https://blog.csdn.net/zong596568821xp/article/details/102454288 背景 在运行复杂的Python程序时,执行时间会很长,这时也许 ...
最新文章
- SQL Server中利用存储过程来高性能地进行分页
- Faster R-CNN 深入理解 改进方法汇总
- 阿里云李飞飞:传统数据库步履蹒跚,未来的机会在哪里?
- 《去哪网编程题》身份证分组
- makefile之伪目标(6)
- 使用SSH更新WordPress
- python安装scrapy教程_Python实用工具包Scrapy安装教程
- matlab实心黑点怎么活,matlab画实心圆点
- Unity3D脚本编程——使用C#语言开发跨平台游戏
- javacv 写mp4_JavaCV 实现视频转码
- ABB电磁流量计ProcessMaster FEP630
- #FFMPEG4.3.1#命令行实现视频码率转换、缩放、剪切、填充、旋转操作(3)
- RGB/YUV/YIQ 颜色空间
- Juc_无juc情况
- 油田生产数据选取22.4.1 观察实验
- 【RegNet】《Designing Network Design Spaces》
- html5横竖条纹背景,CSS制作Web页面条纹背景样式的介绍
- 前沿科技探究之AI在索引推荐的应用
- Devops成功的八大炫酷工具
- 张玉成科学院计算机所,专家人才库数据----中国科学院计算技术研究所
热门文章
- linux 占用缓存前10_Linux安装软件时很多人会遇到这个报错,如何解决?
- python随机分组的思路_python – 对对象进行分组以实现所有组的类似平均属性
- android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
- Leetcode每日一题:44.wildcard-matching(通配符匹配)
- 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)
- 《人月神话》读后感1
- cut out数据增强_被多种离散化场景困扰?8种python技巧!让数据处理更简单
- 计算机科学与技术素材,计算机科学与技术ppt素材
- python通过内置函数测试对象类型_python测试开发(01-递归函数+内置函数)
- [Ext JS] Sencha Cmd命令参考之二