go 应用程序性能测试
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。它的输出格式各字段的含义依次是:
- 采样点落在该函数中的次数
- 采样点落在该函数中的百分比
- 上一项的累积百分比
- 采样点落在该函数,以及被它调用的函数中的总次数
- 采样点落在该函数,以及被它调用的函数中的总次数百分比
- 函数名
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环境变量中。
生成图表展示的方法:
- 使用
go tool pprof your-executable-name --dot profile-filename > heap.gv
命令生成可以在graphviz里面看的gv文件,在查看各个方法/函数的内存消耗的同时查看它们之间的调用关系 - 生成了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 应用程序性能测试的更多相关文章
- LoadRunner调用Java程序—性能测试-转载
LoadRunner调用Java程序—性能测试 为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...
- GCC高级测试功能扩展——程序性能测试工具gprof、程序覆盖测试工具gcov
gprof是GNU组织下的一个比较有用的性能测试功能: 主要功能: 找出应用程序中消耗CPU时间最多的函数: 产生程序运行时的函数调用关系.调用次数 基本原理: 首先用户要使用gprof工具, ...
- LoadRunner调用Java程序—性能测试
为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunner如何调用Java测试代码,完成压力测试. 通常我 ...
- 性能测试类,让你写法代码养成经常测试的好习惯 -ASP.NET C#
介绍: 可以很方便的在代码里循环执行 需要测试的函数 自动统计出执行时间,支持多线程. 使用方法: PerformanceTest p = new PerformanceTest(); p.SetC ...
- 转:jmeter性能测试---登录百度进行搜索
在做web程序性能测试时,loadrunner和jmeter是两款常用的工具,两者比较起来,jmeter非常轻巧,且开源免费,上手快.这里简单介绍下jmeter的使用,以登录百度进行搜索为例. jme ...
- Android 程序优化总结
第一部分 编程规范 1.1 基本要求: 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行. 打算干什么,要简单,直接. 尽量使用标准库函数和公共函数 不要随意定义全局变量,尽量使用局部变量. ...
- 拥抱小程序,WeTest小程序全链路测试解决方案正式上线
背景 随着微信开放小程序开发功能,迅速在各个实体店抢占流量入口,广大商家看到了在线和离线的机会整合,利用小程序版本特点低成本进入市场,达到流量的获取和转化. 伴随着资本的进入,小程序开发市场也因此越来 ...
- ASP.NET中常用的优化性能的方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...
- LoadRunner培训初级教程
一 LoadRunner简介 1.1 Loadrunner介绍 LoadRunner 是 HP Mercury Interactive 用来测试应用程序性能的工具 LoadRunner 通过模拟一个 ...
随机推荐
- Centos环境下部署游戏服务器-自动化
计算机是没有智力的,只会接受指令,运行指令,得出结果.因此就算你让它重复做一件事多少次,它也学不会自动去做这件事.对于重复繁琐的事情,做为一个懒惰的程序员,必须告诉机器去做这件事情,然后就行了,而不是 ...
- Tomcat运行DOM4J的时候报ClassNotFoundException
WEB应用中一个模块用到了DOM4J,加载到TOMCAT中运行,报错如下(给出部分StackTrace): java.lang.ClassNotFoundException: org.dom4j.Do ...
- 《JAVA编程那点事儿》读书笔记(二)——类和对象
方法: 1. 基本的main方法: public static void main(String[] args) 2.静态方法内部调用非静态方法:重新声明一个类,通过这个类来调用非静态方法 publi ...
- js中substr与substring的用法与区别
substrsubstr(start,length)表示从start位置开始,截取length长度的字符串. var src="images/pic_1.png";alert(sr ...
- sourceforge.net 打不开怎么办?(转)
sourceforge.net 打不开怎么办?找个镜像地址下吧! 笔者试了下这个地址,可以打开 http://www.mirrorservice.org/sites/download.source ...
- [原]HDU-1598-find the most comfortable road(暴力枚举+Kruskal最小生成树)
题意: 给出一个图,然后Q个询问,每次询问从一个节点到另一个节点,联通图中的“最大边和最小边之差”的最小值,但如果节点之间不连通,则输出-1. 思路:由于询问Q < 11,m < 1000 ...
- 5.cadence原理图上[原创]
一.库管理 1.打开原理图,,按键盘P键 在目标库下可以直接收索需要的元件,则可直接找到 在原理图中放置器件时,结束放置快捷键:Esc 双击后,可自动将该元件对应的库添加到你的库中,该方法找元件效果好 ...
- hadoop hadoop-0.20.2-cdh3u4升级
[hadoop@lab02 ~]$ uname -aLinux lab02 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_ ...
- poj 2479 (DP)
求一个区间内连续两段不相交区间最大和. // File Name: 2479.cpp // Author: Missa_Chen // Created Time: 2013年06月22日 星期六 16 ...
- 【笨嘴拙舌WINDOWS】剪切板
Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制.Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局 ...