go pprof 性能分析

425 阅读3分钟

数据采样方式

  • untime/pprof:采集程序(非 Server)的指定区块的运行数据进行分析。
  • net/http/pprof:基于 HTTP Server 运行,并且可以采集运行时数据进行分析。
  • go test:通过运行测试用例,并指定所需标识来进行采集。

支持使用的模式

  • Report generation:报告生成。
  • Interactive terminal use:交互式终端使用。
  • Web interface:Web 界面。

可以做的内容:cpu profiling(cpu分析)、内存分析、阻塞分析、互斥锁分析、Goroutine分析

使用实例 1. 通过浏览器访问

引入包 image.png

开启监听 image.png

运行程序之后 浏览器访问 http://127.0.0.1:6060/debug/pprof/

image.png

图中

  • allocs:查看过去所有内存分配的样本,访问路径为 $HOST/debug/pprof/allocs
  • block:查看导致阻塞同步的堆栈跟踪,访问路径为 $HOST/debug/pprof/block
  • cmdline: 当前程序的命令行的完整调用路径。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪,访问路径为 $HOST/debug/pprof/goroutine
  • heap:查看活动对象的内存分配情况, 访问路径为 $HOST/debug/pprof/heap
  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为 $HOST/debug/pprof/mutex
  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件,访问路径为 $HOST/debug/pprof/profile
  • threadcreate:查看创建新 OS 线程的堆栈跟踪,访问路径为 $HOST/debug/pprof/threadcreate

2.通过交互式终端访问 打开命令行输入: go tool pprof http:``//localhost:6060/debug/pprof/profile?seconds=60 表示需要等待60s进行 cpu分析

如果是tls启动的http server 则调用命令 go tool pprof https+insecure://localhost:6060/debug/pprof/profile?seconds=60

60s结束后会进入pprof命令行交互模式,输入top10就可以查看前10个函数资源消耗。

image.png

  • flat:函数自身的运行耗时。
  • flat%:函数自身在 CPU 运行耗时总比例。
  • sum%:函数自身累积使用 CPU 总比例。
  • cum:函数自身及其调用函数的运行总耗时。
  • cum%:函数自身及其调用函数的运行耗时总比例。
  • Name:函数名。

查看内存分配情况:

go tool pprof http://localhost:6060/debug/pprof/heap

image.png 输入web在网页上查看内存分配情况

image.png 框越大代表所用内存越多,框中从上到下为包名、函数名、内存占比。 上述分析默认类型为inuse_space, 内存分析分类有:

  • inuse_space:分析应用程序的常驻内存占用情况。
  • alloc_objects:分析应用程序的内存临时分配情况。
  • inuse_objects:查看每个函数分别的对应数量
  • alloc_space:查看分配的内存空间大小 对应命令为-
 go tool pprof -Type(参数) http://localhost:6060/debug/pprof/heap

Goroutine Profiling

命令:

go tool pprof http://localhost:6060/debug/pprof/goroutine

再输入traces命令就可以所有的调用栈,栈中调用顺序为自下而上,左边数字为使用了多少个goroutine

image.png

Mutex Profiling

runtime.SetMutexProfileFraction(1)  //设置采集频率
go tool pprof http://localhost:6061/debug/pprof/mutex

调用top命令就可以看到互斥量排名:

image.png

Block Profiling

runtime.SetBlockProfileRate(1) //设置采集频率

go tool pprof http://localhost:6060/debug/pprof/block

top查看阻塞排名:

image.png

通过测试用例进行分析

运行test函数 生成相关分析文件

go test -bench=. -cpuprofile=cpu.profile

输入命令 go tool pprof 文件名分析文件

调用web查看网页端调用分析

profiling一般与性能测试一起使用,只有在高负载的情况下profiling才有意义