性能调试

性能调试

1、http服务端

package main

import (
	_ "net/http/pprof" // 会自动注册 handler 到 http server,方便通过 http 接口获取程序运行采样报告
)

func main() {
	// runtime.GOMAXPROCS(1) // 限制 CPU 使用数,避免过载
	runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪
	runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪

	go func() {
		// 启动一个 http server,注意 pprof 相关的 handler 已经自动注册过了
		if err := http.ListenAndServe(":6060", nil); err != nil {
			log.Fatal(err)
		}
		os.Exit(0)
	}()

}

如果是gin服务,可以用 "github.com/gin-contrib/pprof",注册引擎pprof.Register(engine)

package main

import (
    "net/http"

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

func main() {
    engine := gin.Default()
    pprof.Register(engine) // 性能
    engine.GET("/test", func(c *gin.Context) {
        c.String(http.StatusOK, "test")
    })
    engine.Run(":3000")
}

如果是mux服务,手动注册路由与相应的处理函数

package main

import (
    "net/http"
    "net/http/pprof"
)

func main() {
    // 启动一个自定义mux的http服务器
    mux := http.NewServeMux()
    mux.HandleFunc("/debug/pprof/", pprof.Index)
    mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
    mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
    mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
    mux.HandleFunc("/debug/pprof/trace", pprof.Trace)

    mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("hello"))
    })

    http.ListenAndServe(":6066", mux)
}

2、pprof使用

浏览器打开http://localhost:6060/debug/pprof/

类型 描述 备注
allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高
blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高
cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice
goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高
heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高
mutex 争用情况的采样信息 可以用浏览器打开,但可读性不高
profile CPU 占用情况的采样信息 浏览器打开会下载文件
threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高
trace 程序运行跟踪信息 浏览器打开会下载文件,可另行参阅《深入浅出 Go trace》
  • 访问:go tool pprof http://localhost:6060/debug/pprof/类型
  • 命令:top、list、web
    top:flat、flat%、sum%、cum、cum%

    • flat:本函数上运行耗费资源
    • flat%:flat 耗费资源 总比例
    • sum%:本函数累积使用 耗费资源 总比例
    • cum:本函数加上它之上的总耗费资源
    • cum%:cum 耗费资源 总比例

    list:看具体位置
    web:需要install graphviz

  • 直接web和火焰【Flame Graph】命令:go tool pprof -http=:9090 http://localhost:6060/debug/pprof/类型
    自动打开网页或输入localhost:9090访问

3、GC查看

运行命令加上GODEBUG='gctrace=1',如GODEBUG='gctrace=1' go run main.go

gc x @xs x%: x+x+x ms clock, x+x/x/x+x ms cpu, x->x->x MB, x MB goal, x P

gc x: GC 执行次数的编号,每次叠加。
@xs:自程序启动后到当前的具体秒数。
x%:自程序启动以来在GC中花费的时间百分比。
x+…+x ms:GC 的标记工作共使用的 CPU 时间占总 CPU 时间的百分比。前者是单个P,后者是整个进程
x->x->x MB:分别表示 GC 启动时, GC 结束时, GC 活动时的堆大小.
x MB goal:下一次触发 GC 的内存占用阈值。
or=red>x->x->x MB:分别表示 GC 启动时, GC 结束时, GC 活动时的堆大小.
x MB goal:下一次触发 GC 的内存占用阈值。
x P:当前使用的处理器 P 的数量。

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