开启:_ "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:函数名称