Go的pprof使用
web 服务器
如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。
代码中加入
_ "net/http/pprof"
在浏览器中我就可以直接看prof信息了
生成CPU状态分析图
下面我们想要生成CPU状态分析图,
调用go tool pprof http://localhost:3999/debug/pprof/profile
或者 go tool pprof http://localhost:3999/debug/pprof/profile --text
就会进入30秒的profile收集时间,在这段事件内猛刷新点击go-tour浏览器上的页面,尽量让cpu占用性能产生数据。
(pprof) top
Total: 3 samples
1 33.3% 33.3% 1 33.3% MHeap_AllocLocked
1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors
1 33.3% 100.0% 1 33.3% runtime.sigprocmask
0 0.0% 100.0% 1 33.3% MCentral_Grow
0 0.0% 100.0% 2 66.7% main.Compile
0 0.0% 100.0% 2 66.7% main.compile
0 0.0% 100.0% 2 66.7% main.run
0 0.0% 100.0% 1 33.3% makeslice1
0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP
0 0.0% 100.0% 2 66.7% net/http.(*conn).serve
(pprof)web
服务进程
如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。
比如:
go func() { log.Println(http.ListenAndServe("localhost:8080", nil))
}()
应用程序
import "runtime/pprof"
func main() {
f, _ := os.Create("./profile.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
.......
}
#./geteandata 运行程序 收集信息
#go tool pprof ./geteandata ./profile.prof 分析生成的文件
进入到pprof中
top 可使用top 查看最耗时的function
web 会在/tmp下生成svg文件,svg文件是可以在浏览器下看的 注:如果报 sh: dot: command not found 则需要安装 graphviz
#yum install graphviz
#dot -V 查看 graphviz是否安装成功
各字段的含义依次是:
1. 采样点落在该函数中的次数
2. 采样点落在该函数中的百分比
3. 上一项的累积百分比
4. 采样点落在该函数,以及被它调用的函数中的总次数
5. 采样点落在该函数,以及被它调用的函数中的总次数百分比
6. 函数名
注:本文部分信息转自 http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html