go-statsd项目
linux命令:
进程:top
收包丢包:netstat -su[c持续输出]
go tool pprof:
我们可以使用go tool pprof
命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。
在Go语言中,我们可以通过标准库的代码包runtime
和runtime/pprof
中的程序来生成三种包含实时性数据的概要文件,分别是CPU概要文件、内存概要文件和程序阻塞概要文件。下面我们先来分别介绍用于生成这三种概要文件的API的用法。
CPU概要文件
CPU主频:即CPU内核工作的时钟频率(CPU Clock Speed)。
CPU主频单位:CPU的主频的基本单位是赫兹(Hz),但更多的是以兆赫兹(MHz)或吉赫兹(GHz)为单位。时钟频率的倒数即为时钟周期。
时钟周期:时钟周期的基本单位为秒(s),但更多的是以毫秒(ms)、微秒(us)或纳秒(ns)为单位。在一个时钟周期内,CPU执行一条运算指令。
总结:也就是说,1000 Hz的CPU主频,每1毫秒(ms)执行一条CPU运算指令。 1 MHz的CPU主频,每1微秒(us)执行一条CPU运算指令。 1 GHz的CPU主频,每1纳秒(ns)执行一条CPU运算指令。
在默认情况下,Go语言的运行时系统会以100 Hz的的频率对CPU使用情况进行取样。也就是说每秒取样100次,即每10毫秒会取样一次。
为什么使用这个频率呢?因为100 Hz既足够产生有用的数据,又不至于让系统产生停顿。并且100这个数上也很容易做换算,比如把总取样计数换算为每秒的取样数。
实际上,这里所说的对CPU使用情况的 取样 就是对当前的Goroutine的 堆栈 上的程序计数器的取样。
由此,我们就可以从样本记录中分析出 代码的计算时间 或者说最耗CPU资源的部分。
我们可以通过以下代码启动对CPU使用情况的记录。
func startCPUProfile() { if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { fmt.Fprintf(os.Stderr, "Can not create cpu profile output file: %s", err) return } if err := pprof.StartCPUProfile(f); err != nil { fmt.Fprintf(os.Stderr, "Can not start cpu profile: %s", err) f.Close() return } } }
在函数startCPUProfile
中,我们首先创建了一个用于存放CPU使用情况记录的文件。这个文件就是CPU概要文件,其绝对路径由*cpuProfile
的值表示。
然后,我们把这个文件的实例作为参数传入到函数`pprof.StartCPUProfile
中。如果此函数没有返回错误,就说明记录操作已经开始。
需要注意的是,只有CPU概要文件的绝对路径有效时此函数才会开启记录操作。
如果我们想要在某一时刻停止CPU使用情况记录操作,就需要调用下面这个函数:
func stopCPUProfile() { if *cpuProfile != "" { pprof.StopCPUProfile() // 把记录的概要信息写到已指定的文件 } }
在这个函数中,并没有代码用于CPU概要文件写入操作。实际上,在启动CPU使用情况记录操作之后,运行时系统就会以每秒100次的频率将取样数据写入到CPU概要文件中。
pprof.StopCPUProfile
函数通过把CPU使用情况取样的频率设置为0来停止取样操作。并且,只有当所有CPU使用情况记录都被写入到CPU概要文件之后,pprof.StopCPUProfile
函数才会退出。从而保证了CPU概要文件的完整性。
内存概要文件
内存概要文件用于保存用户程序执行期间的内存使用情况,也就是程序运行过程中堆内存的分配情况。
Go语言运行时,系统会对用户程序运行期间所有的堆内存分配进行记录。不论在取样的那一时刻、堆内存已用字节数是否有增长,只要有字节被分配且数量足够,分析器就会对其进行取样。
开启内存使用情况记录的方式如下:
func startMemProfile() { if *memProfile != "" && *memProfileRate > 0 { runtime.MemProfileRate = *memProfileRate } }
go tool pprof --text http://localhost:6060/debug/pprof/heap
go tool pprof --web http://localhost:6060/debug/pprof/heap
go tool pprof --gv http://localhost:6060/debug/pprof/heap
go tool pprof --text http://localhost:6060/debug/pprof/heap
go tool pprof --text http://localhost:6060/debug/pprof
go tool pprof --text http://localhost:6060/debug/pprof/goroutine
go tool pprof --text http://localhost:6060/debug/pprof/threadcreate
go tool pprof --text http://localhost:6060/debug/pprof/heap
go tool pprof --text http://localhost:6060/debug/pprof/cpu
go tool pprof --text http://localhost:6060/debug/pprof/heap
go tool pprof --web http://localhost:6060/debug/pprof/heap
go tool pprof --text http://localhost:6060/debug/pprof/heap
go tool pprof --top http://localhost:6060/debug/pprof/heap
go tool pprof --text http://localhost:6060/debug/pprof/heap