社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
pprof 和 trace 这东西可以分析GC具体的瓶颈位置!!以及每一个线程具体什么时候运行的!!反正各种好处!
之前网上 大家各种抄袭,复制,我相信没有几个人真正玩过这玩意儿,因为项目需要,最后我也是在国外网站上才找到真正使用方法!!下面介绍一下。
我设置了一个pprof 以及 trace 联合使用的方案!
具体看源码
package main
import (
"net/http"
"runtime"
"os"
"fmt"
"runtime/trace"
_"net/http/pprof"
"runtime/debug"
"time"
"sync"
)
func main() {
//开启强大的分析器
go pprof()
//以下是运行测试(也可以贴你自己的)代码
var c sync.Map
for i:=0;i<100;i++{
time.Sleep(time.Second*1)
go func(){
for j:=0;j<1000000;j++{
time.Sleep(time.Millisecond*20)
c.Store(fmt.Sprintf("%d",j),j)
fmt.Println(c.Load(fmt.Sprintf("%d",j)))
}
}()
}
time.Sleep(time.Second*20)
fmt.Scan()
}
//运行pprof分析器
func pprof(){
go func() {
//关闭GC
debug.SetGCPercent(-1)
//运行trace
http.HandleFunc("/start", traces)
//停止trace
http.HandleFunc("/stop", traceStop)
//手动GC
http.HandleFunc("/gc", gc)
//网站开始监听
http.ListenAndServe(":6060", nil)
}()
}
//手动GC
func gc(w http.ResponseWriter, r *http.Request) {
runtime.GC()
w.Write([]byte("StartGC"))
}
//运行trace
func traces(w http.ResponseWriter, r *http.Request){
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
err = trace.Start(f)
if err != nil {
panic(err)
}
w.Write([]byte("TrancStart"))
fmt.Println("StartTrancs")
}
//停止trace
func traceStop(w http.ResponseWriter, r *http.Request){
trace.Stop()
w.Write([]byte("TrancStop"))
fmt.Println("StopTrancs")
}
第四步:接下来就可以享受了!!哈哈
程序运行后随便打开一个CMD 然后输入
go tool pprof http://localhost:6060/debug/pprof/profile
或者
go tool pprof --alloc_objects http://localhost:6060/debug/pprof/heap
然后等30秒就分析好了
分析完成后!然后再输入
就好了w 水电b
就可以查看具体pprof的信息了
第五步:如果想看trace的信息 只需要再谷歌浏览器中输入
然后等一会儿,再输入
当然期间也可以 手动gc
再然后 程序运行的地方自动生成一个文件
在cmd中输入 go tool trace trace.out(具体路径)
它会生成一个路径 一定要谷歌浏览器
最简单方法
1)增加如下代码
//导入包
import (
"net/http"
_ "net/http/pprof"
)
//增加如下代码
go func() {
fmt.Println(http.ListenAndServe(":5567", nil))
}()
2)执行curl 127.0.0.1:5567/debug/pprof/trace?seconds=10 > trace.data,获取到trace.data数据
3) 执行 go tool trace -http=':8888' your_app_bin trace.data。会跳转到浏览器查看trace到数据.
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!