性能调试
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 的数量。