内推美团:求一份 Java 简历,坐标:北京。右下角“与我联系”有我联系方式
前言
如果要在 golang 开发过程中进行性能调优,一般需要使用 pprof,本文介绍的是 pprof 工具使用方法。
下载测试代码
go get
中可以获取测试程序, 注意加上 -d
避免下载后自动安装
Github
go get -d github.com/wolfogre/go-pprof-practice cd $GOPATH/src/github.com/wolfogre/go-pprof-practice
如果 go get 下载不了, 可以 git clone 下载
gir clone https://github.com/wolfogre/go-pprof-practice
对代码进行编译
然后运行
go mod init go mod tidy
最后再运行
go build ./go-pprof-practice
保持程序运行,打开浏览器访问 http://localhost:6060/debug/pprof/
,可以看到如下页面:
参数说明
类型 | 描述 | 备注 |
allocs | 内存分配情况的采样信息 | 可以用浏览器打开,但可读性不高 |
blocks | 阻塞操作情况的采样信息 | 可以用浏览器打开,但可读性不高 |
cmdline | 显示程序启动命令及参数 | 可以用浏览器打开,这里会显示 ./go-pprof-practice |
goroutine | 当前所有协程的堆栈信息 | 可以用浏览器打开,但可读性不高 |
heap | 堆上内存使用情况的采样信息 | 可以用浏览器打开,但可读性不高 |
mutex | 锁争用情况的采样信息 | 可以用浏览器打开,但可读性不高 |
profile | CPU 占用情况的采样信息 | 浏览器打开会下载文件 |
threadcreate | 系统线程创建情况的采样信息 | 可以用浏览器打开,但可读性不高 |
trace | 程序运行跟踪信息 | 浏览器打开会下载文件,本文不涉及 |
代码说明
测试代码程序中 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) }() // 略 }
排查 CPU 占用过高问题
可以通过活动监视器查看下 practice 程序的占用。
可以使用 go tool pprof http://localhost:6060/debug/pprof/profile
进行排查。
输入 top 命令, 查看 CPU 占用较高的调用:
可以看到的是其中一百亿次空循环占用了大量 CPU 时间,因此就定位到了问题。