这是我参加[第五届青训营]笔记创作活动的第一天.
准备工作:
git clone https://github.com/wolfogre/go-pprof-practice.git
什么是pprof?
pprof是golang官方提供的用于可视化和分析项目性能数据的工具,支持web界面显示或者交互式终端使用.
可以做什么?
- allocs: 分析项目中内存的分配使用情况.
- block: 检测项目中goroutine的阻塞情况.
- goroutine: 检测项目中goroutine的创建.
- mutex: 互斥锁分析,监控项目中锁竞争.
- threadcreate: 项目中进程的创建.
- heap trace 堆栈上对象分析
如何使用它?
首先在项目中添加net/http/pprof包,如果不是一个web项目的话还需要在项目中启动web服务
import _"net/http/pprof"
//启动web服务
go func(){
log.Println(http.ListenAndServe("localhost:6060",nil)
}
在命令行中执行:
go tool pprof http://localhost:6060/debug/pprof/你想要分析的属性
(最基本)分析五部曲:
- 运行命令查看程序执行情况
- 用top查看最占用资源的代码
- 用list {函数名} 查看函数具体是哪一块占用了非常多资源
- 执行web获取资源占用的svg图
- 修改代码
实践:
go-pprof-practice库存在不同性能问题,可以帮助我们实践pprof的基本使用. 首先运行go run,发现整个项目一切执行正常,命令行交替打印一些动物的行为. 此时我们执行上述提到的pprof命令.
此时我们可以发现tiger类的eat函数占用了非常多的时间,接着使用list 查看
(pprof): list Eat
可以发现Eat的问题是存在一个空循环,导致占用非常多时间.继续调用:
(pprof): web
查看函数执行的svg图,pprof生怕我们看不到还特地加红加粗哈哈哈.
修改代码后会发现一切恢复正常.
这里仅仅用执行时间作为一个例子,go-pprof-practice项目可不仅仅只有这些问题,还有什么内存分配,死锁发生给我们学习pprof,这里就不一一举例了.
这是我第一次参加字节的活动,希望能让自己变得更优秀!