golang 性能分析
基础工具
官方包 pprof
包含两部分:
- 编译到程序中的 runtime/pprof 包
- 性能剖析工具 go tool pprof
核心流程就是通过 runtime/pprof 包在运行时生成各维度的pprof分析文件,然后通过 go tool pprof
对文件进行交互式的分析。
分析维度
- CPU 性能分析
- 内存性能分析
- 阻塞性能分析
- 锁性能分析
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大于采集时间。