开启:_ "net/http/pprof"
代码监听:http.ListenAndServe(ip, nil) //ip比如127.0.0.1:6069
web访问:http://127.0.0.1:6069/debug/pprof/
(其中,点击goroutine时,地址上debug=1,如果改为debug=2,则可以看到阻塞了多久和阻塞原因)
查看profile:go tool pprof http://0.0.0.0:6069/debug/pprof/goroutine 或 go tool pprof http://0.0.0.0:6069/debug/pprof/heap或go tool pprof http://127.0.0.1:6069/debug/pprof/profile
其中,最后的goroutine可以是其它(在web上看到的都可以),常用的就是goroutine(查看goroutine泄漏)和heap(查看内存泄漏)和profile(查看cpu占用);
profile指令(敲入help查看指令):如果生成的是goroutine,则使用top列出正在运行的每个函数的goroutine的数量,如果生成的是heap,则看到的是占用内存,list查看某个函数的代码,以及该函数每行代码的指标信息,traces则可以打印函数的调用栈的信息,web指令需要安装graphviz
注意:heap能帮助我们发现内存问题,但不一定能发现内存泄露问题
graphviz安装:
安装时选择添加环境变量到用户
打开cmd
输入:
查看goroutine泄漏:go tool pprof -http 127.0.0.1:8081 http://0.0.0.0:6069/debug/pprof/goroutine
查看内存泄漏:go tool pprof -http 127.0.0.1:8081 http://0.0.0.0:6069/debug/pprof/heap
查看cpu占用:go tool pprof -http 127.0.0.1:8081 http://0.0.0.0:6069/debug/pprof/profile?seconds=30
其中:127.0.0.1:8081是加载完自动打开的地址,http://0.0.0.0:6069/debug/pprof/profile是分析的文件,?seconds=1是分析的时间区间,这里是30秒,默认不填是60秒
以profile为例,top中显示:
Flat:采样时,该函数正在运行的次数*采样频率(10ms),即得到估算的函数运行”采样时间”。这里不包括函数等待子函数返回;
Flat%:同上的 CPU 运行耗时总比例;
Sum%:给定函数累积使用 CPU 总比例,如第二行 sum% = 89.72% = 88.90% + 0.83%
Cum:当前函数加上它之上的调用运行总耗时,包括函数等待子函数返回。因此 flat
Cum%:同上的 CPU 运行耗时总比例
Name:函数名称