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代码性能分析工具相关推荐

  1. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  2. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  3. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  4. Windows phone 7应用之代码性能分析工具——Profile.

    前端时间断断续续的写了几篇关于Windows phone 7本地数据库访问文章. 最近在Window phone 7 APPStore上注册Apphub账号看到很多很有意思的小应用, 也结识几个专职做 ...

  5. cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark

    Golang的testing包中除了单元测试testing.T之外,还提供了testing.B的Benchmark性能测试,Benchmark测试主要是通过测试CPU和内存的效率,来评估测试代码的性能 ...

  6. go build 无文件_Go 质量保证:集成测试(1) 用 Docker 执行测试

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 简介 "测试会带来失败,而失败会带来理解." -- Burt Rutan Burt ...

  7. go build 无文件_GO笔记之详解GO的编译执行流程

    上篇文章介绍了Golang在不同系统下的安装,并完成了经典的Hello World案例.在这个过程中,我们用到了go run命令,它完成源码从编译到执行的整个过程. 今天来详细介绍下这个过程.简单理解 ...

  8. go build 无文件_Go之Gin+Vue开发一个线上外卖应用

    我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户端和服务端 ...

  9. Python之代码性能分析工具(时间+内存)

    原文链接:https://blog.csdn.net/zong596568821xp/article/details/102454288 背景 在运行复杂的Python程序时,执行时间会很长,这时也许 ...

最新文章

  1. SQL Server中利用存储过程来高性能地进行分页
  2. Faster R-CNN 深入理解 改进方法汇总
  3. 阿里云李飞飞:传统数据库步履蹒跚,未来的机会在哪里?
  4. 《去哪网编程题》身份证分组
  5. makefile之伪目标(6)
  6. 使用SSH更新WordPress
  7. python安装scrapy教程_Python实用工具包Scrapy安装教程
  8. matlab实心黑点怎么活,matlab画实心圆点
  9. Unity3D脚本编程——使用C#语言开发跨平台游戏
  10. javacv 写mp4_JavaCV 实现视频转码
  11. ABB电磁流量计ProcessMaster FEP630
  12. #FFMPEG4.3.1#命令行实现视频码率转换、缩放、剪切、填充、旋转操作(3)
  13. RGB/YUV/YIQ 颜色空间
  14. Juc_无juc情况
  15. 油田生产数据选取22.4.1 观察实验
  16. 【RegNet】《Designing Network Design Spaces》
  17. html5横竖条纹背景,CSS制作Web页面条纹背景样式的介绍
  18. 前沿科技探究之AI在索引推荐的应用
  19. Devops成功的八大炫酷工具
  20. 张玉成科学院计算机所,专家人才库数据----中国科学院计算技术研究所

热门文章

  1. linux 占用缓存前10_Linux安装软件时很多人会遇到这个报错,如何解决?
  2. python随机分组的思路_python – 对对象进行分组以实现所有组的类似平均属性
  3. android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
  4. Leetcode每日一题:44.wildcard-matching(通配符匹配)
  5. 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)
  6. 《人月神话》读后感1
  7. cut out数据增强_被多种离散化场景困扰?8种python技巧!让数据处理更简单
  8. 计算机科学与技术素材,计算机科学与技术ppt素材
  9. python通过内置函数测试对象类型_python测试开发(01-递归函数+内置函数)
  10. [Ext JS] Sencha Cmd命令参考之二