仅仅记录概念性信息以及可能用到的操作,并未涉及根据pprof生成的报告进行分析的内容。
介绍
pprof是Go程序的性能分析工具,提供了分析和可视化Go程序性能的方法。它可用于分析CPU使用率、内存使用率和阻塞事件,并能生成详细报告,以帮助识别程序中的性能瓶颈。
CPU profilling:CPU分析,按照一定频率采集所监听的应用程序的CPU(含寄存器)的使用情况,可确定应用程序在主动消耗CPU周期时花费时间的位置。
Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存的使用情况,以及检查内存泄漏。
Block Profilling:阻塞分析,记录Goroutine阻塞等待同步(包括定时器通道)的位置,默认不开启,需要调用 runtime.SetBlockProfileRate 进行设置。
Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况,默认不开启,需要调用 runtime.SetMutexProfileFraction 进行设置。
Goroutine Profiling:Goroutine 分析,通过对当前程序正在运行的 Goroutine 进行堆栈跟踪和分析来提高程序性能的技术.很多问题出现时的表象就是 Goroutine 暴增,而这时候我们要做的事情之一就是查看程序中的 Goroutine 正在做什么事情,因为什么阻塞了。
使用
首先,在代码中添加 _ "net/http/pprof" 的引用
// 限制 CPU 使用数,避免过载,可加可不加
runtime.GOMAXPROCS(1)
// 如果未来希望进行互斥锁的采集,
// 那么需要通过调用该方法来设置采集频率
// 若不设置或没有设置大于 0 的数值,默认是不进行采集的
runtime.SetMutexProfileFraction(1)
// 开启对阻塞操作的跟踪
runtime.SetBlockProfileRate(1)
运行起程序后
可通过浏览器访问,http://localhost:6060/debug/pprof/ 得知程序总览页面
| 类型 | 解释 |
|---|---|
| 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。 |
由于直接阅读采样信息缺乏直观性,我们往往需要借助 go tool pprof 命令来排查问题,这个命令是 go 原生自带的,所以不用额外安装。
直接点进去,是直接下载对于的profile文件
如果机会在浏览器中查看,需要在路径名后加上debug=1
go tool pprof 命令是用于分析 Go 程序性能的工具。它可用于生成并分析 CPU 使用情况、内存使用情况和阻塞事件等的性能概要。
基本用法:
go tool pprof [options] URL
URL为pprof浏览器查看中,对应的 http://localhost:6060/debug/pprof/profile, http://localhost:6060/debug/pprof/mutex等等
go tool pprof从该接口获得程序信息,然后通过命令行交互对该信息进行查看
其中options中常用的:
- -http参数:添加
-http=:6001,将在所指定的端口号运行一个 pprof 的分析用的站点 - -seconds: 指定 profile 的持续时间。
- -inuse_space:分析应用程序的常驻内存占用情况。
- -alloc_objects:分析应用程序的内存临时分配情况。
go tool pprof 命令还提供了许多子命令,可用于进一步分析和可视化分析数据。常用的一些子命令包括:
- web : 用交互式浏览器打开分析数据
- top : 显示使用最多资源的函数
- list : 显示分析中函数的源代码
- svg : 生成调用图的 SVG 可视化
- traces : 打印出对应的所有调用栈,以及指标信息
top命令的输出报告:
(pprof) top10
Showing nodes accounting for 36.23s, 97.26% of 37.25s total
Dropped 80 nodes (cum <= 0.19s)
Showing top 10 nodes out of 34
flat flat% sum% cum cum% Name
32.63s 87.60% 87.60% 32.70s 87.79% syscall.syscall
0.87s 2.34% 89.93% 0.88s 2.36% runtime.stringtoslicebyte
0.69s 1.85% 91.79% 0.69s 1.85% runtime.memmove
0.52s 1.40% 93.18% 0.52s 1.40% runtime.nanotime
...
(pprof)
- flat:函数自身的运行耗时。
- flat%:函数自身在 CPU 运行耗时总比例。
- sum%:函数自身累积使用 CPU 总比例。
- cum:函数自身及其调用函数的运行总耗时。
- cum%:函数自身及其调用函数的运行耗时总比例。
- Name:函数名
可视化查看
前置条件:安装 graphviz 组件
推荐使用: 此命令将在所指定的端口号运行一个 PProf 的分析用的站点。
$ go tool pprof -http=:6001 profile
进入以下界面
常用可视化图为:Graph,Flame Graph
Graph视图是pprof工具中用来展示整体函数调用流程的视图。
在这个视图中,每个函数被表示为一个框,每个函数的调用关系被表示为从调用者指向被调用者的线。 框越大、线越粗、框颜色越鲜艳(红色)就代表该函数占用的时间越久,开销越大。相反,若框颜色越淡、越小,则代表该函数在整体函数调用流程中开销相对较小。
火焰图是一种特殊的性能分析工具,它通过将函数堆栈的调用关系可视化,帮助我们快速发现程序中的性能瓶颈。
与Graph视图不同的是,火焰图更侧重于展示函数之间的相对关系,而不是绝对关系,并且火焰图中的函数调用关系是从上往下展示的。
在火焰图中,函数的宽度代表了该函数在程序中所占用的时间/资源的比例,同时颜色也可以帮助我们分辨出不同的函数。