golang 性能分析(pprof)

采样方式

net/http/pprof

  • 适用于程序长期运行的线上服务
    • 底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问
  • 如果是使用了HTTP包的路由,则只需要import _ "net/http/pprof"即可
    • 此时会自动把相关路由路径注册到了默认的http.DefaultServeMux
package pprof

func init() {
   
	http.HandleFunc("/debug/pprof/", Index)
	http.HandleFunc("/debug/pprof/cmdline", Cmdline)
	http.HandleFunc("/debug/pprof/profile", Profile)
	http.HandleFunc("/debug/pprof/symbol", Symbol)
	http.HandleFunc("/debug/pprof/trace", Trace)
}
  • 如果使用了第三方server(例如gin),则需要手动注册路由
    • gin还可以直接使用github.com/DeanThompson/ginpprof包,只需要ginpprof.Wrap(router)即可
package main

import (
	"github.com/gin-gonic/gin"
	"github.com/DeanThompson/ginpprof"
)

func main() {
   
	router := gin.Default()
	
	// automatically add routers for net/http/pprof
	// e.g. /debug/pprof, /debug/pprof/heap, etc.
	ginpprof.Wrap(router)
	// ginpprof also plays well with *gin.RouterGroup
	// group := router.Group("/debug/pprof")
	// ginpprof.WrapGroup(group)
}

benchmark pprof

  • 命令行

    • 生成分析文件: go test -bench -run none -cpuprofile
      • 除了-cpuprofile, 还有-benchmem -memprofile-blockprofile等指标
  • Goland
    golang 性能分析(pprof)_第1张图片

runtime/pprof

  • 适用于程序只运行一次就停的,例如每天只跑一次的离线预处理程序
  • 运行程序后生成cpu.profmem.prof两个文件

你可能感兴趣的:(Golang,golang)