pprof
pprof 是一种用于可视化和分析分析数据的工具。本文介绍了CPU,Heap,Goroutine,Mutex,Block的性能调优实战。
CPU
命令:go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"。
top
top展示了消耗较多的函数,其中各部分指标意义如下:
- flat:当前函数本身耗时。
- flag%:flat占CPU总时间的比例。
- sum%:上面每一行的flat%总和。
- cum:当前函数本身加上其调用函数的总函数。
- cun%:cum占CPU总时间的比例。 根据指标函数,可以得出:
- flat = cum:函数中没有调用其他函数。
- flat == 0:函数中只有其他函数的调用。
从图中可以看到,Eat函数占用了绝大多数的CPU时间。
list
list用来展示指定函数各行的消耗时间。函数名作为list参数传入,如果存在多个同名函数,pprof将展示所有函数。
从上图我们可以看到,Eat函数中消耗最大的是23~26行无意义的循环。
web
web命令用来展示调用关系图,可以用于更直观的展示。
从上图可以很清楚的看到,Eat函数占用了最多的cpu时间。
Heap
命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"。
View
使用上述命令后,会打开一个包含堆内存使用情况的函数调用图,可以通过左上角的"View"下拉菜单选择不同的表现形式,默认为Graph。
Graph
Top
Source
source试图定位代码时,可以在搜索框搜索函数名加快定位速度。
Flamegraph
从上图可以看到,func1和Steal两个函数使用了大量内存空间,通过source视图可以定位到mouse.go:60和mouse.go:46两处代码分配了大量内存。
SAMPLE
sample指定了采样的标准,各指标解释如下:
- alloc_objects:程序累计申请的对象数。
- alloc_space:程序类似申请的内存大小。
- inuse_objects:程序当前持有的对象数。
- inuse_space:程序当前占用的内存大小。
inuse_space
默认为inuse_sapce,view中展示的便是inuse_space情况。
alloc_space
通过alloc_space的graph试图,我们可以看到未在inuse_space中显示的Run函数申请了大量内存:
再通过source视图即可定位到代码,可以看到这里申请了大量未使用内存,所以未在inuse中找出。
Goroutine
命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"。
下图是Flame Graph,上下为调用顺序,左右长度代表数量/时间/空间大小。
可以点击图中函数进行交互,将注意点集中。
从图中可以看到,func1函数创建了大量协程,使用source定位代码如下:
可以看到这里创建了大量包含time.Sleep的协程。
Mutex
命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"。
从Graph视图中可以看到,wolf.func1函数申请了很多锁。
使用Source试图定位代码:
Block
命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"。
使用source定位到代码:
锁也会导致阻塞,所以锁的处理应该在阻塞前。这里由于锁的问题还没解决,所以出现了两段阻塞问题代码。
全量数据
由于全量数据过多,所以pprof会过滤一些占用较小的函数。如果想查看全量数据,可以在网址http://localhost:6060/debug/pprof/](http://localhost:6060/debug/pprof/页面中点击具体指标查看: