以下内容为 Go语言核心36讲 这里的分析和笔记
包
runtime/pprof;
net/http/pprof;
runtime/trace;
分析工具
go tool pprof
go tool trace
命令行调试命令 top
trace
list
web
用于性能分析的概要文件有三种
CPU 概要文件(CPU Profile)、内存概要文件(Mem Profile)和阻塞概要文件(Block Profile)。
- CPU 上正在执行的 Go 代码。
- 正在执行的 Go 代码以及堆内存的使用情况
- 代表着 Go 程序中的一个 goroutine 阻塞事件。
这些概要文件中包含的都是:在某一段时间内,对 Go 程序的相关指标进行多次采样后得到的概要信息。
如何生成概要文件
格式 : protocol buffers 生成的二进制数据流,或者说字节流。
如何对cpu概要信息采样
runtime/pprof.StartCPUProfile SetCPUProfileRate 启动协程收集信息
StopCPUProfile SetCPUProfileRate=0 通知协程停止收集,写入StartCPUProfile指定的写入器中
采样频率固定
设定内存采样频率
runtime.MemProfileRate 平均每分配多少个字节,就对堆内存的使用情况进行一次采样
获取内存概要信息 runtime/pprof.WriteHeapProfile 把收集好的内存概要信息,写到我们指定的写入器中
获取实时内存概要信息 : runtime.ReadMemStats
获取阻塞概要信息
设定频率 runtime.SetBlockProfileRate rate 参数 这个参数的含义是,只要发现一个阻塞事件的持续时间达到了多少个纳秒,就可以对其进行采样
获取概要信息
调用runtime/pprof包中的Lookup函数并传入参数值"block",从而得到一个*runtime/pprof.Profile类型的值(以下简称Profile值)。在这之后,我们还需要调用这个Profile值的WriteTo方法,以驱使它把概要信息写进我们指定的写入器中。
writeto 参数 写入器 io.Writer类型 ,debug int
debug 类型值 0 通过WriteTo方法写进写入器的概要信息仅会包含go tool pprof工具所需的内存地址,这些内存地址会以十六进制的形式展现出来。 1 相应的包名、函数名、源码文件路径、代码行号等信息就都会作为注释被加入进去 2 被输出的概要信息也会是普通的文本,并且通常会包含更多的细节。至于这些细节都包含了哪些内容,那就要看我们调用runtime/pprof.Lookup函数的时候传入的是什么样的参数值了
runtime/pprof.Lookup函数正确调用方式
参数可选值
goroutine、heap、allocs、threadcreate、block和mutex。
写log
调用该函数返回的Profile值的WriteTo方法
"heap"会使得被输出的内存概要信息默认以“在用空间”(inuse_space)的视角呈现, 等价于上面提到的内存概要信息
"allocs"对应的默认视角则是“已分配空间”(alloc_space)。 debug=0 有细微区别 >0格式相同
参数值"threadcreate"会使Lookup函数去收集一些堆栈跟踪信息。这些堆栈跟踪信息中的每一个都会描绘出一个代码调用链,这些调用链上的代码都导致新的操作系统线程产生 debug 0 ,1
"block"代表的是,因争用同步原语而被阻塞的那些代码的堆栈跟踪信息 debug 0 1 2
"mutex"代表的是,曾经作为同步原语持有者的那些代码,它们的堆栈跟踪信息。 debug 0 1 2
“在用空间”是指,已经被分配但还未被释放的内存空间。在这个视角下,go tool pprof工具并不会去理会与已释放空间有关的那部分信息。
“已分配空间”的视角下,所有的内存分配信息都会被展现出来,无论这些内存空间在采样时是否已被释放。
这里所说的同步原语,指的是存在于 Go 语言运行时系统内部的一种底层的同步工具,或者说一种同步机制。它是直接面向内存地址的,并以异步信号量和原子操作作为实现手段。我们已经熟知的通道、互斥锁、条件变量、”WaitGroup“,以及 Go 语言运行时系统本身,都会利用它来实现自己的功能。
runtime/pprof.Lookup 函数一瞥
如何为基于 HTTP 协议的网络服务添加性能分析接口
import _ "net/http/pprof"
log.Println(http.ListenAndServe("localhost:8082", nil))
http://localhost:8082/debug/pprof
参数
debug
gc 仅heap可用
/debug/pprof/profile路径被访问,程序就会去执行对 CPU 概要信息的采样
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60
/debug/pprof/trace ?待整理