pprof是golang提供的一个性能分析工具,功能强大。包含cpu、heap、block、traces等执行信息。
"runtime""runtime/pprof""runtime/trace"
原生工具包包含pprof、trace。具体用法如下,直接贴代码:
cf, err := os.Create("cpu.pprof") if err != nil { log.Fatal("could not create CPU profile: ", err) } if err := pprof.StartCPUProfile(cf); err != nil { //监控cpu log.Fatal("could not start CPU profile: ", err) } defer pprof.StopCPUProfile()
mf, err := os.Create(memprofile) if err != nil { log.Fatal("could not create memory profile: ", err) }// 业务代码// ...runtime.GC() // GC,获取最新的数据信息if err := pprof.WriteHeapProfile(mf); err != nil { // 写入内存信息 log.Fatal("could not write memory profile: ", err)}
tf, err := os.Create("trace.out") if err != nil { panic(fmt.Errorf("failed to create trace output file: %v", err)) } defer func() { if err := tf.Close(); err != nil { log.Fatalf("failed to close trace file: %v", err) } }() // 写trace文件 if err := trace.Start(tf); err != nil { log.Fatalf("failed to start trace: %v", err) } defer trace.Stop()
golang net/pprof 封装了runtime包中的pprof 工具,大多数情况定位和分析问题都是在线上,直接使用runtime原生工具需要停止程序,或者需要编码人员写框架代码支持动态获取,相对的比较麻烦。 net/pprof库做到了无需停止程序,可以直接使用
使用简单
main 包中import "net/http" _ "net/http/pprof"//代码中添加:http.ListenAndServe("http://127.0.0.1:8080",nil)
接下来就可以直接使用了,直接在浏览器中输入
http://127.0.0.1:8080/debug/pprof/
可以看到runtime包中cpu、heap、trace等与之对应的都可以获取到。其中profile和trace直接点击可以下载文件,然后使用go tool pprof xx进行分析。
在生产环境无法直接使用浏览器,也可以通过以下方式下载离线文件,然后通过go tool 进行分析:
go tool pprof http://localhost:6060/debug/pprof/heap// 获取cpu信息,采集时间为30sgo tool pprof http://localhost:6060/debug/pprof/profile?seconds=30go tool pprof http://localhost:6060/debug/pprof/blockgo tool pprof http://localhost:6060/debug/pprof/mutex// 获取trace文件,采集时间为5swget -O trace.out http://localhost:6060/debug/pprof/trace?seconds=5go tool trace trace.out// 其中go tool pprof 也可以使用curl -s xxx > xx.prof 来替代,获取离线文件,例如curl -s http://localhost:6060/debug/pprof/heap > heap.prof
建议net pprof 监听使用127.0.0.1 能够在一定程度上防止他人恶意采集。因为在采集信息的过程中对业务是有性能损耗的。runtime底层pprof其实就是一系列的埋点操作。
Golang pprof分析CPU
Golang 内存性能分析
Download | Graphviz
https://graphviz.org/download/