首页 > 代码库 > Go的pprof使用

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信息了

Image

生成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

屏幕快照 2012-12-26 下午10.32.17

 

服务进程

如果你的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

Go的pprof使用