这是我参与「第五届青训营 」伴学笔记创作活动的第 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占用
通过pprof工具查看CPU Profile
go tool pprof http://localhost:6060/debug/pprof/profile
上图中flat的意义是这个函数自己的运行时间(不包括函数中调用其他函数运行的时间),cum的意义是这个函数整体的运行时间。flat=0时表示这个函数只调用了其他函数,flat=cum时表示这个函数没有调用其他函数。
很明显问题在
Tiger.Eat上。
可以发现问题在24行的for循环上。
内存
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap
加上-http可以让我们打开http ui界面。
可以很直观地看出问题在
Mouse.Steal这里。
发现问题在第50行
GC
原文中提到的GC问题,在我的go版本(1.19)中并没有出现,看来是被go编译优化掉了,go nb。
goroutine泄露
原文中提到的goroutine泄露问题,似乎也没有出现,看来也是被优化掉了。
锁争用
这个是确实存在的。
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/mutex
可以看出,Wolf.Howl占用了这个锁整整1秒。
查看实际代码,发现确实存在问题,将其注释掉。
阻塞操作
最后发现还有3个block问题,我们去查看并分析。
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/block
可以确定的是问题在Cat.Pee这里,我们定位问题,并分析解决。