golang 性能分析

参考资料
Go 语言高性能编程
Markdown 教程
gin-contrib/pprof
google/pprof

基础工具

官方包 pprof 包含两部分:

  • 编译到程序中的 runtime/pprof 包
  • 性能剖析工具 go tool pprof

核心流程就是通过 runtime/pprof 包在运行时生成各维度的pprof分析文件,然后通过 go tool pprof 对文件进行交互式的分析。

分析维度

  1. CPU 性能分析
  2. 内存性能分析
  3. 阻塞性能分析
  4. 锁性能分析

CPU性能分析步骤

在起始代码中加入采集代码,这段代码将会把采集信息写入到指定文件中。详细代码参考:github

f, _ := os.OpenFile("cpu.pprof", os.O_CREATE|os.O_RDWR, 0644)
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

运行 go run pprof/pprof/cmd.go 获得 cpu.pprof 文件。

运行 go tool pprof -http=:9999 cpu.pprof 启动web界面查看,访问 http://localhost:9999/ui/ 如下图

此外 pprof 也支持命令行交互方式。

更简单的使用方式

我们使用一个易用性更强的库 pkg/profile 来采集性能数据,pkg/profile 封装了 runtime/pprof 的接口,使用起来更简单。详细代码参考:github

defer profile.Start().Stop()

运行 go run pprof/profile/cmd.go 获得文件。

cjl:go_example/ (main) $ go run pprof/profile/cmd.go                                                                                                         [17:57:27]
2021/03/14 17:57:28 profile: memory profiling enabled (rate 1), /var/folders/9w/bm92cvd11ns7dtzj_grsprl00000gn/T/profile660349272/mem.pprof
2021/03/14 17:57:28 profile: memory profiling disabled, /var/folders/9w/bm92cvd11ns7dtzj_grsprl00000gn/T/profile660349272/mem.pprof

运行 go tool pprof -http=:9999 /var/folders/9w/bm92cvd11ns7dtzj_grsprl00000gn/T/profile660349272/mem.pprof 启动web界面查看。

gin 框架集成pprof

利用开源中间件可以方便的分析gin框架的请求,详细步骤参考:
https://github.com/gin-contrib/pprof

package main

import (
    "github.com/gin-contrib/pprof"
    "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  pprof.Register(router)
  router.Run(":8080")
}

启动服务后(建议仅在开发环境开启),可以通过URL直接获得分析文件,如http://localhost:8080/debug/pprof/profile,部分请求可添加seconds=5参数修改采集时间。

运行 go tool pprof -http=:9999 "http://localhost:8080/debug/pprof/profile" 可通过网页查看数据结果。

如碰到错误提示 profile duration exceeds server's writetimeout 需修改启动server时的参数write_timeout大于采集时间。