性能调优pprof | 豆包MarsCode AI刷题

66 阅读3分钟

pprof

pprof 是一种用于可视化和分析分析数据的工具。本文介绍了CPU,Heap,Goroutine,Mutex,Block的性能调优实战。

CPU

命令:go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"。

top

top展示了消耗较多的函数,其中各部分指标意义如下:

  1. flat:当前函数本身耗时。
  2. flag%:flat占CPU总时间的比例。
  3. sum%:上面每一行的flat%总和。
  4. cum:当前函数本身加上其调用函数的总函数。
  5. cun%:cum占CPU总时间的比例。 根据指标函数,可以得出:
  6. flat = cum:函数中没有调用其他函数。
  7. flat == 0:函数中只有其他函数的调用。 image-20241128213630509.png 从图中可以看到,Eat函数占用了绝大多数的CPU时间。

list

list用来展示指定函数各行的消耗时间。函数名作为list参数传入,如果存在多个同名函数,pprof将展示所有函数。 image-20241128220000422.png 从上图我们可以看到,Eat函数中消耗最大的是23~26行无意义的循环。

web

web命令用来展示调用关系图,可以用于更直观的展示。 image-20241128220220843.png 从上图可以很清楚的看到,Eat函数占用了最多的cpu时间。

Heap

命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"。

View

使用上述命令后,会打开一个包含堆内存使用情况的函数调用图,可以通过左上角的"View"下拉菜单选择不同的表现形式,默认为Graph。

Graph

image-20241128220801193.png

Top

image-20241128220721562.png

Source

source试图定位代码时,可以在搜索框搜索函数名加快定位速度。 image-20241128220743908.png

Flamegraph

image-20241128220846021.png 从上图可以看到,func1和Steal两个函数使用了大量内存空间,通过source视图可以定位到mouse.go:60和mouse.go:46两处代码分配了大量内存。

SAMPLE

sample指定了采样的标准,各指标解释如下:

  1. alloc_objects:程序累计申请的对象数。
  2. alloc_space:程序类似申请的内存大小。
  3. inuse_objects:程序当前持有的对象数。
  4. inuse_space:程序当前占用的内存大小。
inuse_space

默认为inuse_sapce,view中展示的便是inuse_space情况。

alloc_space

通过alloc_space的graph试图,我们可以看到未在inuse_space中显示的Run函数申请了大量内存: image-20241128221759187.png 再通过source视图即可定位到代码,可以看到这里申请了大量未使用内存,所以未在inuse中找出。 image-20241128222022989.png

Goroutine

命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"。

下图是Flame Graph,上下为调用顺序,左右长度代表数量/时间/空间大小。

可以点击图中函数进行交互,将注意点集中。

image-20241128222208724.png

从图中可以看到,func1函数创建了大量协程,使用source定位代码如下:

image-20241128222740307.png

可以看到这里创建了大量包含time.Sleep的协程。

Mutex

命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"。

从Graph视图中可以看到,wolf.func1函数申请了很多锁。

image-20241128222845356.png

使用Source试图定位代码:

image-20241128223108610.png

Block

命令:go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"。

image-20241128223215991.png

使用source定位到代码:

image-20241128223316537.png

image-20241128223502894.png

锁也会导致阻塞,所以锁的处理应该在阻塞前。这里由于锁的问题还没解决,所以出现了两段阻塞问题代码。

全量数据

由于全量数据过多,所以pprof会过滤一些占用较小的函数。如果想查看全量数据,可以在网址http://localhost:6060/debug/pprof/](http://localhost:6060/debug/pprof/页面中点击具体指标查看:

image-20241128223853131.png

image-20241128223948151.png