Go pprof工具实战 | 青训营笔记

228 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天。

本篇笔记主要基于仓库wolfogre/go-pprof-practice: go pprof practice. (github.com)以及相关教程。

Setup

代码的版本比较旧,在新版本的go中在将代码clone下来后需要先初始化Go Module。

go mod init github.com/wolfogre/go-pprof-practice

然后是编译运行

go build 
./go-pprof-practice

并在浏览器中打开:6060/debug/pprof/

CPU过高

首先通过top指令查看CPU占用 image.png 通过pprof工具查看CPU Profile

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

image.png 上图中flat的意义是这个函数自己的运行时间(不包括函数中调用其他函数运行的时间),cum的意义是这个函数整体的运行时间。flat=0时表示这个函数只调用了其他函数,flat=cum时表示这个函数没有调用其他函数。 很明显问题在Tiger.Eat上。

image.png 可以发现问题在24行的for循环上。

内存

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap

加上-http可以让我们打开http ui界面。

image.png 可以很直观地看出问题在Mouse.Steal这里。

image.png 发现问题在第50行

GC

原文中提到的GC问题,在我的go版本(1.19)中并没有出现,看来是被go编译优化掉了,go nb。

image.png

goroutine泄露

原文中提到的goroutine泄露问题,似乎也没有出现,看来也是被优化掉了。 image.png

锁争用

这个是确实存在的。

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/mutex

image.png

可以看出,Wolf.Howl占用了这个锁整整1秒。

image.png

查看实际代码,发现确实存在问题,将其注释掉。

阻塞操作

image.png

最后发现还有3个block问题,我们去查看并分析。

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/block

image.png

可以确定的是问题在Cat.Pee这里,我们定位问题,并分析解决。

image.png