go-statsd项目

linux命令:

进程:top

收包丢包:netstat -su[c持续输出]


go tool pprof:

 

我们可以使用go tool pprof命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。

 

在Go语言中,我们可以通过标准库的代码包runtimeruntime/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

 

posted @ 2017-11-20 17:19  WangC.W  阅读(272)  评论(0编辑  收藏  举报