Go1.5正式版程序性能分析小积累,实验环境windows64
2015-08-22 22:23
666 查看
方法一:
内存分配器跟踪:GODEBUG=allocfreetrace=1
调度器追踪
调度器追踪可以提供对 goroutine 调度的动态行为的内视,并且允许调试负载平衡和可扩展性问题。要启用调度器追踪,
可以带有环境变量 GODEBUG=schedtrace=1000 来运行程序(这个值的意思是输入的周期,单位 ms,这种情况下是每秒一次):
set GODEBUG=schedtrace=1000
SCHED 1004ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=4 runqueue=8 [0 1 0 3]
SCHED 2005ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=5 runqueue=6 [1 5 4 0]
SCHED 3008ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=4 runqueue=10 [2 2 2 1]
使用:set GODEBUG=gctrace=1 / GODEBUG=gctrace=2
直接运行可执行文件:server.exe
格式:gc # @#s #%: #+...+# ms clock, #+...+# ms cpu, #->#-># MB, # MB goal, # P
GC #
表示第几次GC
@#s
表示程序开始多长时间执行的GC
#%
表示程序开始GC时间占用的百分比(percentage of time spent in GC since program start)
#+...+#
表示GC执行时CPU阻塞时间和
#->#-># MB
表示GC开始堆大小,结束堆大小,在活跃堆大小
# MB goal
表示目标对大小
# P
表示程序运行时CPU核数
示例 :
gc 13 @1277.835s 0%: 0+1.0+0+1.0+1.0 ms clock, 0+1.0+0+0/1.0/0+3.0 ms cpu, 0->0->0 MB, 4 MB goal, 4 P
方法二:
三、使用pprof文件分析:
内存分配器跟踪:GODEBUG=allocfreetrace=1
调度器追踪
调度器追踪可以提供对 goroutine 调度的动态行为的内视,并且允许调试负载平衡和可扩展性问题。要启用调度器追踪,
可以带有环境变量 GODEBUG=schedtrace=1000 来运行程序(这个值的意思是输入的周期,单位 ms,这种情况下是每秒一次):
set GODEBUG=schedtrace=1000
SCHED 1004ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=4 runqueue=8 [0 1 0 3]
SCHED 2005ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=5 runqueue=6 [1 5 4 0]
SCHED 3008ms: gomaxprocs=4 idleprocs=0 threads=11 idlethreads=4 runqueue=10 [2 2 2 1]
第一个数字("1004ms")是从程序开始后的时间。Gomaxprocs 是当前的 GOMAXPROCS 值。 Idleprocs 是空载的处理器数(剩下的在执行 Go 代码)。Threads 是调度器产生的工作线程总数(线程有三种状态:执行 Go 代码(gomaxprocs-idleprocs),执行 syscalls/cgocalls,闲置)。Idlethreads是闲置的工作线程数。Runqueue 是运行的 goroutine 的全局队列长度。方括号中的数字("[0 1 0 3]")是可执行的 goroutine 的预处理器队列的长度。全局和局部队列的长度总和表示运行中可用的 goroutine 的总数。 注意:你可以随意组合追踪器,如:GODEBUG = gctrace = 1,allocfreetrace = 1,schedtrace = 1000。 注意:同样有详细的调度器追踪,你可以这样启用它:GODEBUG = schedtrace = 1000,scheddetail = 1。它将会输出每一个 goroutine、工作线程和处理器的详细信息。我们将不会在这里讨论它的格式,因为它主要是给调度器开发者使用;你可以在这里src/pkg/runtime/proc.c找到它的详细信息。 当一个程序不与 GOMAXPROCS 成线性比例和/或没有消耗 100% 的 CPU 时间,调度器追踪就显得非常有用。理想的情况是:所有的处理器都在忙碌地运行 Go 代码,线程数合理,所有队列都有充足的任务且任务是合理均匀的分布的: gomaxprocs=8 idleprocs=0 threads=40 idlethreads=5 runqueue=10 [20 20 20 20 20 20 20 20] 不好的情况是上面所列的东西并没有完全达到。例如下面这个演示,没有足够的任务来保持所有的处理器繁忙: gomaxprocs=8 idleprocs=6 threads=40 idlethreads=30 runqueue=0 [0 2 0 0 0 1 0 0] 注意:这里使用操作系统提供的实际CPU利用率作为最终的标准。在 Unix 系操作系统中是 top 命令。在 Windows 系统中是任务管理器。 你可以使用 goroutine 分析器来了解哪些 goroutine 块处于任务短缺状态。注意,只要所有的处理器处于忙绿状态,负载失衡就不是最坏的,它只会导致适度的负载平衡开销。
内存统计 Go 运行时可以通过 runtime.ReadMemStats 函数提供粗糙的内存统计。这个统计同样可以通过 http://myserver:6060/debug/pprof/heap?debug=1 底部的net/http/pprof提供。统计资料,点击此处。 一些值得关注的地方是: 1. HeapAlloc - 当前堆大小。 2. HeapSys - 总的堆大小。 3. HeapObjects - 堆中对象的总数。 4. HeapReleased - 释放到操作系统中的内存;如果内存超过五分钟没有使用,运行时将会把它释放到操作系统中,你可以通过 runtime/debug.FreeOSMemory 来强制改变这个过程。 5. Sys - 操作系统分配的总内存。 6. Sys-HeapReleased - 程序的有效内存消耗。 7. StackSys - goroutine 栈的内存消耗(注意:一些栈是从堆中分配的,因此没有计入这里,不幸的是,没有办法得到栈的总大小(https://code.google.com/p/go/issues/detail?id=7468))。 8. MSpanSys/MCacheSys/BuckHashSys/GCSys/OtherSys - 运行时为各种辅助用途分配的内存;它们没什么好关注的,除非过高的话。 9. PauseNs - 最后一次垃圾回收的持续时间。
使用:set GODEBUG=gctrace=1 / GODEBUG=gctrace=2
直接运行可执行文件:server.exe
格式:gc # @#s #%: #+...+# ms clock, #+...+# ms cpu, #->#-># MB, # MB goal, # P
GC #
表示第几次GC
@#s
表示程序开始多长时间执行的GC
#%
表示程序开始GC时间占用的百分比(percentage of time spent in GC since program start)
#+...+#
表示GC执行时CPU阻塞时间和
#->#-># MB
表示GC开始堆大小,结束堆大小,在活跃堆大小
# MB goal
表示目标对大小
# P
表示程序运行时CPU核数
示例 :
gc 13 @1277.835s 0%: 0+1.0+0+1.0+1.0 ms clock, 0+1.0+0+0/1.0/0+3.0 ms cpu, 0->0->0 MB, 4 MB goal, 4 P
方法二:
import _ "net/http/pprof" go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() 在程序中添加以上代码. ----------------------------------------------------------- 使用下面的命令可以查看各项性能: go tool pprof http://localhost:6060/debug/pprof/heap 查看30秒内的cpu使用: go tool pprof http://localhost:6060/debug/pprof/profile 查看goroutime性能: go tool pprof http://localhost:6060/debug/pprof/block 查看5秒的执行trace. wget http://localhost:6060/debug/pprof/trace?seconds=5 在浏览器打开查看: http://localhost:6060/debug/pprof/ https://blog.golang.org/2011/06/profiling-go-programs.html 命令:go tool pprof /mnt/Go/src/main http://localhost:6060/debug/pprof/heap 输入list可以看到详细情况. 输入web 可以在web页面查看 此外我们也可以运行go tool pprof your-executable-name --dot profile-filename > heap.gv,这样将得到一个heap.gv文件,我们在graphviz里面打开这个文件将得到一个更详细的包括调用关系在内的内存消耗图。当然,我们如果只需要一张图,也可以运行dot -Tpng heap.gv > heap.png将这个gv文件另存为png图,这样就可以像我一样,在下面展示剖析结果了。
三、使用pprof文件分析:
import ( "runtime/pprof" // 引用pprof package "os" ) func main() { f, _ := os.Create("profile_file") pprof.StartCPUProfile(f) // 开始cpu profile,结果写到文件f中 defer pprof.StopCPUProfile() // 结束profile ... }
运行 运行程序,生成profile文件 分析 在命令行上执行: go tool pprof [binary] [profile] 进入pprof环境后,可以用help命令查看帮助信息 最常用的命令如top10,可以看最耗时的function 这里详细解释一下top命令的输出格式,例如: 14 2.1% 17.2% 58 8.7% std::_Rb_tree::find 各字段的含义依次是: 1. 采样点落在该函数中的次数 2. 采样点落在该函数中的百分比 3. 上一项的累积百分比 4. 采样点落在该函数,以及被它调用的函数中的总次数 5. 采样点落在该函数,以及被它调用的函数中的总次数百分比 6. 函数名
相关文章推荐
- Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结
- GO语言异常处理机制panic和recover分析
- go语言执行windows下命令行的方法
- Go语言计算两个经度和纬度之间距离的方法
- Go语言排序与接口实例分析
- Go语言导出内容到Excel的方法
- go语言实现sqrt的方法
- Go语言MessageBox用法实例
- Go语言判断指定文件是否存在的方法
- go语言制作的zip压缩程序
- go语言channel实现多核并行化运行的方法
- Go语言MD5加密用法实例
- go语言使用scp的方法实例分析
- Go语言中的switch用法实例分析
- go语言检测文件是否存在的方法
- Go语言里的结构体文法实例分析
- Go语言结构体定义和使用方法
- Go语言的队列和堆栈实现方法
- Go语言实现Fibonacci数列的方法
- go语言里包的用法实例