go语言中性能分析工具pprof使用心得
pprof是一个go程序性能分析工具,可以用于分析go程序的CPU使用率、内存使用情况等
项目中如何使用pprof
package main
import (
"log"
"net/http"
_ "net/http/pprof" //初始化包
"os"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1) //设置只使用1个cpu
runtime.SetBlockProfileRate(1) //开启对阻塞的追踪
runtime.SetMutexProfileFraction(1) //开启对锁的追踪
go func() {
//启动一个http.server
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
//测试用
for { }
}
使用pprof
使用 go build 进行构建
浏览器打开
http://localhost:8080/debug/pprof/,即可看到如下页面
指标说明:
allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高
blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高
cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice
goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高
heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高
mutex 锁争用情况的采样信息 可以用浏览器打开,但可读性不高
profile CPU 占用情况的采样信息 浏览器打开会下载文件
threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高
trace 程序运行跟踪信息 浏览器打开会下载文件
用法一: 排查CPU占用过高
//命令
go tool pprof http://localhost:6060/debug/pprof/profile
//再输入 top
//再输入 list 标识名 即可查询到相关详细信息,如下图显示,可以找到哪里占用cpu比较高,可以看到,
//这里有一个大循环,是占用大量cpu的,
用法二: 排查占用内存过高
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/heap
//2. top
//3. list 对象名
用法三: 排查频繁内存回收
通过如下命令 GODEBUG=gctrace=1 ./main | grep gc 可以查看到程序的内存回收情况
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/allocs
//2. top
//3. list 对象名
用法四: 排查协程泄露
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/goruntine
//2. top
//3. list 对象名
用法五: 排查锁的争用
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/mutex
//2. top
//3. list 对象名
用法六: 排查阻塞的情况
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/block
//2. top
//3. list 对象名
结语:
其实还有 火焰图等相关知识,但是本次遇到的bug,没有用到,这里就不写了,感兴趣的小伙伴,可以自己查资料哈