Go 服务性能分析 pprof 的使用
Go 服务性能分析 pprof 的使用 go 是主打性能的语言 所以官方集成了方便性能检测的工具 go tool pprof 方便好用,主要可以收集如下指标 profile : 程序 cpu 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 heap : 程序 heap 内存使用情况,和调用关系 goroutine : 程序内 goroutine 启动数,各自的调用情况。 block : 报告导致阻塞的同步原语的情况 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈。默认情况下未启用,需要手动调用runtime.SetBlockProfileRate启用。 mutex: 报告锁竞争。默认情况下未启用,需要手动调用runtime.SetMutexProfileFraction启用。 集成到服务 服务应用 常驻的服务型应用要使用 pprof 首先得在服务启动入口导入包 import _ "net/http/pprof" ··· go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() 然后浏览器访问http://localhost:6060/debug/pprof/,显示如下页面 如上如果服务是 http 服务且使用的是 http.DefaultServeMux 不需要做任何路由注册默认会注册相关路由,初始化调用了init 函数会自动注册,路径为 /debug/pprof/,显示上图,能大概看个当前 goroutine 数目、堆分配情况、锁的情况,具体分析还是要使用下文的 go tool pprof 工具。 如果使用的是自定义的 ServeMux 或 Handler 需要我们自己手动注册需要的路由,比如使用 echo 框架的时候 func RegisterRoutes(engine *echo.Echo) { router := engine.Group("") ...... // 按需注册 router.GET("/debug/pprof", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/allocs", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/block", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/goroutine", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/heap", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/mutex", echo.WrapHandler(http.HandlerFunc(pprof.Index))) router.GET("/debug/pprof/cmdline", echo.WrapHandler(http.HandlerFunc(pprof.Cmdline))) router.GET("/debug/pprof/profile", echo.WrapHandler(http.HandlerFunc(pprof.Profile))) router.GET("/debug/pprof/symbol", echo.WrapHandler(http.HandlerFunc(pprof.Symbol))) router.POST("/debug/pprof/symbol", echo.WrapHandler(http.HandlerFunc(pprof.Symbol))) router.GET("/debug/pprof/trace", echo.WrapHandler(http.HandlerFunc(pprof.Trace))) router.GET("/debug/pprof/threadcreate", echo.WrapHandler(http.HandlerFunc(pprof.Index))) } 如果使用的是 gin 框架,可以使用官方提供的 middleware ...