go 应用程序性能测试

时间:2022-09-01 07:46:15

runtime/pprof

我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析.

如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。(Go语言的pprof是Google C++ profiler的移植.)

比如下面的例子:

   1:  

   2: import (

   3:     "flag"

   4:     "fmt"

   5:     "os"

   6:     "runtime/pprof"

   7: )

   8:  

   9: var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

  10:  

  11: func main() {

  12:  

  13:     flag.Parse()

  14:     if *cpuprofile != "" {

  15:         f, err := os.Create(*cpuprofile)

  16:         if err != nil {

  17:             fmt.Println(err)

  18:         }

  19:         pprof.StartCPUProfile(f)

  20:         defer pprof.StopCPUProfile()

  21:     }

  22:     // ...

  23: }

 

运行程序的时候加一个--cpuprofile参数,比如fabonacci --cpuprofile=fabonacci.prof

这样程序运行的时候的cpu信息就会记录到XXX.prof中了。

 

以上内容来自:

http://blog.csdn.net/yhcharles/article/details/16820485

http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html

http://blog.golang.org/profiling-go-programs 

 

go tool pprof

准备go tool pprof的运行环境,直接运行这个命令需要用到perl,

在Windows下可以安装ActivePerl(http://www.activestate.com/activeperl),我这里下载的是:ActivePerl 5.16.3 for Windows (64-bit, x64) 。

没有安装perl,会报下面错误:

D:\gocodes\src\logDemo>go tool pprof

go tool: perl not found

D:\gocodes\src\logDemo>go tool pprof logDemo.exe a.prof

go tool: perl not found

安装好后,如下输入命令,就可以看到一些统计信息:

这里的例子是使用go tool pprof your-executable-name profile-filename即可进入pprof命令模式分析数据

   1: D:\gocodes\src\logDemo>go tool pprof logDemo.exe a.prof

   2: Welcome to pprof!  For help, type 'help'.

   3: (pprof) top

   4: Total: 236 samples

   5:       19   8.1%   8.1%       32  13.6% runtime.mallocgc

   6:       12   5.1%  13.1%       26  11.0% fmt.(*pp).printArg

   7:       12   5.1%  18.2%      236 100.0% text

   8:        9   3.8%  22.0%        9   3.8% runtime.memmove

   9:        8   3.4%  25.4%       55  23.3% os.(*File).writeConsole

  10:        8   3.4%  28.8%        8   3.4% runtime.indexbytebody

  11:        7   3.0%  31.8%      144  61.0% fmt.Fprintln

  12:        7   3.0%  34.7%       11   4.7% runtime.makeslice

  13:        6   2.5%  37.3%       25  10.6% bufio.(*Reader).ReadSlice

  14:        5   2.1%  39.4%        6   2.5% fmt.(*fmt).padString

  15: (pprof)

top命令可以看最耗时的function。它的输出格式各字段的含义依次是:

  1. 采样点落在该函数中的次数
  2. 采样点落在该函数中的百分比
  3. 上一项的累积百分比
  4. 采样点落在该函数,以及被它调用的函数中的总次数
  5. 采样点落在该函数,以及被它调用的函数中的总次数百分比
  6. 函数名

http://blog.csdn.net/yhcharles/article/details/16820485

当然我们也可以用下面方式来查看各个函数/方法的内存消耗排名。

D:\gocodes\src\logDemo>go tool pprof logDemo.exe --text a.prof

Total: 236 samples

      19   8.1%   8.1%       32  13.6% runtime.mallocgc

      12   5.1%  13.1%       26  11.0% fmt.(*pp).printArg

      12   5.1%  18.2%      236 100.0% text

       9   3.8%  22.0%        9   3.8% runtime.memmove

       8   3.4%  25.4%       55  23.3% os.(*File).writeConsole

       8   3.4%  28.8%        8   3.4% runtime.indexbytebody

       7   3.0%  31.8%      144  61.0% fmt.Fprintln

       7   3.0%  34.7%       11   4.7% runtime.makeslice

       6   2.5%  37.3%       25  10.6% bufio.(*Reader).ReadSlice

       5   2.1%  39.4%        6   2.5% fmt.(*fmt).padString

       5   2.1%  41.5%        6   2.5% runtime.entersyscall

       5   2.1%  43.6%        5   2.1% runtime.memclr

       5   2.1%  45.8%        6   2.5% unicode/utf8.DecodeRune

       4   1.7%  47.5%        9   3.8% assertE2Tret

       4   1.7%  49.2%        7   3.0% copyout

       4   1.7%  50.8%       30  12.7% fmt.(*pp).doPrint

       4   1.7%  52.5%       30  12.7% gostringsize

       4   1.7%  54.2%       81  34.3% os.(*File).Write

       4   1.7%  55.9%       16   6.8% runtime.cgocall

       4   1.7%  57.6%        9   3.8% runtime.deferreturn

       4   1.7%  59.3%       40  16.9% runtime.slicebytetostring

       4   1.7%  61.0%        4   1.7% sync/atomic.AddUint32

       4   1.7%  62.7%       20   8.5% syscall.Syscall6

       4   1.7%  64.4%       15   6.4% unicode/utf16.Encode

       3   1.3%  65.7%       28  11.9% bufio.(*Reader).ReadLine

       3   1.3%  66.9%        9   3.8% copyin

       3   1.3%  68.2%        5   2.1% endcgo

       3   1.3%  69.5%        6   2.5% fmt.(*cache).put

       3   1.3%  70.8%        5   2.1% fmt.(*fmt).init

       3   1.3%  72.0%       11   4.7% fmt.(*pp).fmtString

       3   1.3%  73.3%        9   3.8% fmt.(*pp).free

       3   1.3%  74.6%        6   2.5% runtime.deferproc

       3   1.3%  75.8%        6   2.5% runtime.mal

       3   1.3%  77.1%        3   1.3% runtime.markallocated

       3   1.3%  78.4%        6   2.5% sync.(*Mutex).Lock

       3   1.3%  79.7%        7   3.0% sync.(*Mutex).Unlock

       3   1.3%  80.9%        3   1.3% sync/atomic.CompareAndSwapUint32

       3   1.3%  82.2%        4   1.7% syscall.(*LazyProc).Addr

       2   0.8%  83.1%        3   1.3% cnew

       2   0.8%  83.9%        2   0.8% fmt.(*fmt).clearflags

       2   0.8%  84.7%      146  61.9% fmt.Println

       2   0.8%  85.6%        3   1.3% freedefer

       2   0.8%  86.4%        2   0.8% popdefer

       2   0.8%  87.3%        2   0.8% runtime.MSpanList_IsEmpty

       2   0.8%  88.1%        2   0.8% runtime.memcopy64

       2   0.8%  89.0%       21   8.9% syscall.WriteConsole

       2   0.8%  89.8%        2   0.8% unicode/utf8.decodeRuneInternal

       1   0.4%  90.3%       10   4.2% bufio.(*Reader).fill

       1   0.4%  90.7%        9   3.8% bytes.IndexByte

       1   0.4%  91.1%        2   0.8% fmt.(*cache).get

       1   0.4%  91.5%        8   3.4% fmt.(*fmt).fmt_s

       1   0.4%  91.9%        1   0.4% fmt.(*fmt).truncate

       1   0.4%  92.4%        1   0.4% newdefer

       1   0.4%  92.8%       77  32.6% os.(*File).write

       1   0.4%  93.2%       10   4.2% runtime.MCentral_AllocList

       1   0.4%  93.6%        1   0.4% runtime.MSpanList_Insert

       1   0.4%  94.1%       10   4.2% runtime.assertE2T

       1   0.4%  94.5%        1   0.4% runtime.casp

       1   0.4%  94.9%        4   1.7% runtime.cnewarray

       1   0.4%  95.3%       10   4.2% runtime.convT2E

       1   0.4%  95.8%        1   0.4% runtime.efacethash

       1   0.4%  96.2%        1   0.4% runtime.exitsyscall

       1   0.4%  96.6%        3   1.3% runtime.new

       1   0.4%  97.0%        1   0.4% runtime.stdcall

       1   0.4%  97.5%        1   0.4% runtime.strcopy

       1   0.4%  97.9%        2   0.8% runtime.unlockOSThread

       1   0.4%  98.3%        1   0.4% save

       1   0.4%  98.7%        1   0.4% syscall.(*LazyProc).Find

       1   0.4%  99.2%        6   2.5% syscall.Read

       1   0.4%  99.6%        2   0.8% unicode/utf8.FullRune

       1   0.4% 100.0%        1   0.4% unlockOSThread

       0   0.0% 100.0%        7   3.0% MCentral_Grow

       0   0.0% 100.0%        3   1.3% MHeap_AllocLocked

       0   0.0% 100.0%        1   0.4% MHeap_FreeLocked

       0   0.0% 100.0%       17   7.2% fmt.newPrinter

       0   0.0% 100.0%        4   1.7% makeslice1

       0   0.0% 100.0%        9   3.8% os.(*File).Read

       0   0.0% 100.0%        9   3.8% os.(*File).read

       0   0.0% 100.0%       10   4.2% runtime.MCache_Refill

       0   0.0% 100.0%        7   3.0% runtime.MHeap_Alloc

       0   0.0% 100.0%        2   0.8% runtime.assertE2T2

       0   0.0% 100.0%      236 100.0% runtime.gosched0

       0   0.0% 100.0%        1   0.4% runtime.lock

       0   0.0% 100.0%      236 100.0% runtime.main

       0   0.0% 100.0%        1   0.4% runtime.nanotime

       0   0.0% 100.0%        1   0.4% syscall.(*LazyProc).mustFind

       0   0.0% 100.0%        5   2.1% syscall.ReadFile

D:\gocodes\src\logDemo>

使用图表展示

如果想不仅看到各个方法/函数的内存消耗排名,还想看到它们之间的调用关系,那就需要安装graphviz或者ghostview才行,相对来说graphviz使用者更多,这里就以它为例。

http://blog.raphaelzhang.com/2014/01/memory-leak-detection-in-go/ 

下载地址:http://www.graphviz.org/Download..php 我下载的是 graphviz-2.36.msi

安装好后,不要忘了设置环境变量。比如我安装的是下面目录: C:\Program Files (x86)\Graphviz2.36\bin 需要把它设置到 path环境变量中。

生成图表展示的方法:

  1. 使用go tool pprof your-executable-name --dot profile-filename > heap.gv命令生成可以在graphviz里面看的gv文件,在查看各个方法/函数的内存消耗的同时查看它们之间的调用关系
  2. 生成了gv文件之后通过dot -Tpng heap.gv > heap.png生成调用关系网与内存消耗图的png图形文件

注意,直接在 pprof 命令行输入 web, 如果不是 web程序,生成时会报下面错误:

D:\gocodes\src\logDemo>go tool pprof logDemo.exe a.prof

Welcome to pprof!  For help, type 'help'.

(pprof) web

Total: 236 samples

Dropping nodes with <= 1 samples; edges with <= 0 abs(samples)

Loading web page file:///C:\Users\GUOHON~1\AppData\Local\Temp\m9inAYN4pq.0.svg

'uname' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

系统找不到指定的路径。

系统找不到指定的路径。

'google-chrome' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

'firefox' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

Could not load web browser.

(pprof)

go 应用程序性能测试的更多相关文章

  1. LoadRunner调用Java程序—性能测试-转载

    LoadRunner调用Java程序—性能测试   为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...

  2. GCC高级测试功能扩展——程序性能测试工具gprof、程序覆盖测试工具gcov

    gprof是GNU组织下的一个比较有用的性能测试功能: 主要功能:   找出应用程序中消耗CPU时间最多的函数: 产生程序运行时的函数调用关系.调用次数 基本原理:   首先用户要使用gprof工具, ...

  3. LoadRunner调用Java程序—性能测试

    为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunner如何调用Java测试代码,完成压力测试. 通常我 ...

  4. 性能测试类,让你写法代码养成经常测试的好习惯 -ASP&period;NET C&num;

    介绍: 可以很方便的在代码里循环执行 需要测试的函数  自动统计出执行时间,支持多线程. 使用方法: PerformanceTest p = new PerformanceTest(); p.SetC ...

  5. 转:jmeter性能测试---登录百度进行搜索

    在做web程序性能测试时,loadrunner和jmeter是两款常用的工具,两者比较起来,jmeter非常轻巧,且开源免费,上手快.这里简单介绍下jmeter的使用,以登录百度进行搜索为例. jme ...

  6. Android 程序优化总结

    第一部分 编程规范 1.1 基本要求: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行. 打算干什么,要简单,直接. 尽量使用标准库函数和公共函数 不要随意定义全局变量,尽量使用局部变量. ...

  7. 拥抱小程序,WeTest小程序全链路测试解决方案正式上线

    背景 随着微信开放小程序开发功能,迅速在各个实体店抢占流量入口,广大商家看到了在线和离线的机会整合,利用小程序版本特点低成本进入市场,达到流量的获取和转化. 伴随着资本的进入,小程序开发市场也因此越来 ...

  8. ASP&period;NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  9. LoadRunner培训初级教程

    一 LoadRunner简介 1.1 Loadrunner介绍 LoadRunner 是 HP Mercury Interactive 用来测试应用程序性能的工具  LoadRunner 通过模拟一个 ...

随机推荐

  1. jquery显示隐藏toggle

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 微信小程序购物商城系统开发系列

    微信小程序购物商城系统开发系列 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统. ...

  3. CentOS中通过stat查看文件的元数据

    CentOS中可以通过stat查看文件的元数据 [baby@xiaoxiao abc]$ stat honey  File: `honey'  Size: 25         Blocks: 8   ...

  4. Hadoop2&period;2&period;0 安装笔记

    在Youtube上找到靠谱的教程:http://www.youtube.com/watch?v=WN2tJk_oL6E 同时把作者的教程下载下来放在百度云盘上了:http://pan.baidu.co ...

  5. PHPer 为什么会被 Javaer 鄙视?

    最近看了知乎上的一个话题 「在工作中,为什么 Java 程序员常常瞧不起 PHP 程序员?」 个人从业多年,用过的后端语言 ASP.ASP.NET.Java.PHP.Node.js.Python,如果 ...

  6. 写手Remoting测试工具

    基于.NET开发分布式系统.经经常使用到Remoting技术.在測试驱动开发流行的今天.假设针对分布式系统中的每一个Remoting接口的每一个方法都要写具体的測试脚本,无疑很浪费时间.所以,我想写一 ...

  7. 热爱H5

    我不去想是否能够功成名就既然选择了前端便只顾埋头于无声 我不去想能否赢得掌声既然钟情于IT就勇敢得踏步前行 我不去想前行的路上会不会日暮穷途既然目标是未来留给现在的只能是汗水 我不去想所谓的成功是不是 ...

  8. 玩转CSS3&lpar;二&rpar;---CSS3实现瀑布布局

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 觉得腾讯微博微频道里的那种布局方式很好,在这里利用CSS3简单的实现了一下. 先上一张效果图: 代码: pubu.css /* CSS Docu ...

  9. XBee&&num;174&semi; ZigBee 模块使用方法

    Digi的ZigBee模块简称S2,根据芯片版本的不同历史上分别有S2,S2B,S2C等,每次硬件平台升级,都会引入一个新的尾缀字母.历史版本中S2和S2B已经停产并被S2C替代.当前S2C是主流平台 ...

  10. Java中选择排序,冒泡排序,插入排序,快速排序

    一:冒泡法排序  //冒泡排序 注:从小到大排   //特点:效率低,实现简单  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...