Go 性能调优学习 | 青训营笔记

97 阅读2分钟

这是我参加[第五届青训营]笔记创作活动的第一天.

准备工作:

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/你想要分析的属性

(最基本)分析五部曲:

  1. 运行命令查看程序执行情况
  2. 用top查看最占用资源的代码
  3. 用list {函数名} 查看函数具体是哪一块占用了非常多资源
  4. 执行web获取资源占用的svg图
  5. 修改代码

实践:

go-pprof-practice库存在不同性能问题,可以帮助我们实践pprof的基本使用. 首先运行go run,发现整个项目一切执行正常,命令行交替打印一些动物的行为. 此时我们执行上述提到的pprof命令.

image.png

image.png 此时我们可以发现tiger类的eat函数占用了非常多的时间,接着使用list 查看

(pprof): list Eat

image.png 可以发现Eat的问题是存在一个空循环,导致占用非常多时间.继续调用:

(pprof): web

查看函数执行的svg图,pprof生怕我们看不到还特地加红加粗哈哈哈.

image.png 修改代码后会发现一切恢复正常.

image.png 这里仅仅用执行时间作为一个例子,go-pprof-practice项目可不仅仅只有这些问题,还有什么内存分配,死锁发生给我们学习pprof,这里就不一一举例了.

image.png

image.png

这是我第一次参加字节的活动,希望能让自己变得更优秀!