Go1.5正式版程序性能分析小积累,实验环境windows64

方法一:

内存分配器跟踪: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. 函数名
时间: 2024-11-14 16:32:52

Go1.5正式版程序性能分析小积累,实验环境windows64的相关文章

Deis 1.0 正式版发布,可用于产品环境!

基于 Docker 的开源 PaaS 系统 Deis 1.0 正式版发布了,这是 Deis 的首个稳定版本,你现在可以在生产环境中使用该系统,这是 Deis 首个基于 Docker 构建的产品级别的 PaaS 系统. Deis 1.0 提供了稳定的 API.丰富的功能特性以及可靠的组件架构.包括: 平台质量  - Deis 由久经沙场的社区进行测试,可处理企业级产品负载 安装便捷 - Deis 可通过一个简单的命令行工具在 30 分钟内安装到 CoreOS 集群中 高可用性 - 整个 Deis

xcode_8正式版安装遇到的小问题

从官网上下载好了xcode_8正式版之后,我们会发现竟然不是以往的zip后缀,而是xip后缀   双击之后不能正常解压 在网上查询了一下资料发现一般是以下两个问题: 1,mac的储存空间不够,别看该xip文件只有4.41G的大小,解压之后会变成12.1G  听网上说至少得腾出20G才能正常加压安装,我是没亲测了,我直接清理腾出了40G出来,保证够用. 2,清理完之后,我发现还是不能解压成功,原因是mac系统版本不够高,至少要更新到10.11.4以上才可以,然后我更新到了10.11.6最新版本.然

程序性能分析及性能测试

这里所说的程序是指对外提供tcp/ip交互协议的服务性程序.网络程序性能分析很重要,比如随着网络请求流量越来越大,我们需要知道已部署的服务能不能满足需求.这里采用对网络服务程序进行建模的方法分析影响程序性能的各要素,并计算相关性能值,它不够精确,但对我们使用其它工具对网络程序进行性能测试提供很好的理论指导. 1.网络请求 图1 什么是网络请求?如图1是<UNIX 网络编程>一书中表示网络交互过程的一幅图,整个请求是指从客户端到服务端 write->read->write->r

Exchange2016正式版功能介绍及全新安装配置

Exchange2016功能介绍及全新安装配置 说到Exchange服务相信很多人都在关注,微软在2015年更新了很多服务,从功能上来说确实做了很多优化及提升,具体就不多说了,微软在2015年10月1日发布了Exchange2016正式版,版本还是分为标准版和企业版,此次发布为多语言版本 同样微软在2015年发布了那些新产品呢 : 我们还是说说Exchange2016,从安装及官网文档上看微软从Exchange2010到Exchange2016角色上缩减了很多,从Exchange2010的Mai

如何不通过系统升级来安装window10正式版?

今天是个特殊的日子7/29,相信大家都等了很久了吧,win10正式版终于上线,一些不懂电脑的人只会通过360和腾讯管家等来升级到win10,而对于大多数像我这样对系统比较热衷的人,我相信,对于那种傻瓜式的升级方式,我们都会不屑一顾!! 现在我来讲讲我如何安装win10专业版的吧,相信大家以前装系统都是用ghost来重装的,但是面向今天刚出的win10系统,相信各大网站上也没有正式版的gho文件吧.那现在怎么办呢?经过小编的精心发现,终于在某网站上找到了相对应的OME版本,这虽说下载下来是iso文

收不到Win10正式版预订通知?一个批处理搞定

目前,已经有不少Win7.Win8.1用户在系统右下角收到Win10正式版的预订提示窗口.点击接受预订后,系统会将Win10正式版所需的安装文件提前下载好,7月29日正式发布的时候,就可以第一时间升级了. 不过,也有不少用户反映自己尚未收到提示,外媒ghacks提供了一系列解决办法,大家不妨试试,据说这些方法还是挺有效的. 这里将可能遇到的问题做成了一个批处理文件(点此下载),解压后即可得到win10fix_full.bat文件,以管理员身份运行后,会出现如下提示: 按任意键继续,出现版本列表,

Mozilla Firefox 33.1.1 正式版发布

今天Firefox 33正式版例行迎来维护更新,版本号升级至33.1.1,此次更新除了修正上个版本存在的部分问题,以及性能上的提升外,新版还增加了一个全新的“忘记” 按钮,点击它可以快速清理浏览历史.Cookies等:书签栏强化,不再仅仅显示网页截图,而是直接获取网站的Logo等.Firefox 33最大的变化是引入了WebRTC通信功能,支持OpenH.264(沙盒). Firefox 33.1 正式版更新内容: • 新增“忘记”按钮: • 强化的书签栏,可以自动获取网页Logo,而不是之前的

WinNTSetup V3.7.0 汉化正式版

WinNTSetup3.7.0正式版 (更新日期:2014年10月3日) —新增对Windows 10(Windows Threshold)环境运行兼容性的支持 WinNTSetup3.6.5正式版 (更新日期:2014年9月9日)—修正syspreped WinXP离线注册表错误的问题 —修正关于对话框DPI问题 —如果WIM中index名字和显示名未定义将使用XML描述字段 —如果注册表加载失败,将记录离线日志错误代码和注册表hive路径 —引导项现在包含(WIMBOOT)或(VHDX)如果

Redis 3.0.0 正式版出炉,高性能 K/V 服务

Redis 3.0.0 正式版最终到来了,与 RC6 版本号比較.该版本号改进包含: * 修复了无磁盘的复制问题 (Oran Agra) * 在角色变化后对 BLPOP 复制进行測试 (Salvatore Sanfilippo) * prepareClientToWrite() 错误处理方法的改进 (Salvatore Sanfilippo) * 移除 dict.c 中不再使用的函数(Salvatore Sanfilippo Redis 3.0 版本号与 2.8 版本号比較,主要新特性包含例如以