## pprof性能分析
golang在语言层面集成了profile采样工具,在程序运行过程中可以获取cpu、heap、block、traces等执行信息
获取profile数据的两种形式:web形式与profile文件生成形式.
### web方式
引入 “net/http/pprof"包,并在主函数中添加一下代码
`http.ListenAndServe(":8080", nil)`
其中,net/http/pprof包的init函数中注册了debug/pprof/路由到http服务中,用浏览器打开http://localhost:8080/debug/pprof/,即可使用pprof提供的功能。
#### 整体信息
http://127.0.0.1:8080/debug/pprof 查看整体信息
allocs
allocs报告过去的内存申请情况
block
报告协程阻塞的情况,可以用来分析和查找死锁等性能瓶颈, 需要调用runtime.SetBlockProfileRate开启
cmdline
主要是调用os.Args,获取程序启动时的命令及参数
goroutine
有哪些协程正在运行、有多少协程在运行等
heap
查看堆相关信息,包括一些GC的信息
mutex
查看互斥的争用情况,默认不开启, 需要调用需要在程序中调用runtime.SetMutexProfileFraction
threadcreate
查看系统线程创建信息
trace
可以向你揭示:Go程序运行中的所有的运行时事件
获取trace文件使用`go tool trace trace文件`进行分析
profile
返回CPU的profile,调用了runtime/pprof包的StartCPUProfile,采样频率为100Hz
获取prifiel文件`go tool pprof profile文件` 进行分析
#### 进入tty分析
从terminal进入profile,进行细致分析
go tool pprof http://localhost:6060/debug/pprof/profile
go tool pprof http://localhost:6060/debug/pprof/heap
go tool pprof http://localhost:6060/debug/pprof/block
### profile文件方式
通过实现代码
```
import "runtime/pprof"
cpuf, err := os.Create("cpu_profile")
if err != nil {
log.Fatal(err)
}
//cpu profile
pprof.StartCPUProfile(cpuf)
defer pprof.StopCPUProfile()
memf, err := os.Create("mem_profile")
if err != nil {
log.Fatal(err)
}
//heap profile
if err := pprof.WriteHeapProfile(memf); err != nil {
log.Fatal(err)
}
defer memf.Close()
```
编译如上程序生成可执行文件main,运行man会生成cpu_profile文件
分析profile
go tool pprof main cpu_profile 执行这个命令就进入了profile 文件了
输入help查看支持命令: web, top, peek, list
top: 列出耗时操作
peek: 是用来查询 函数名字的,这个名字是list需要使用的名字
list: 是用来将函数时间消耗列出来的
有疑问加站长微信联系(非本文作者))