无法使用go工具pprof与现有服务器

时间:2015-05-31 18:09:26

标签: go gorilla pprof

我有一个现有的http服务器,我想描述一下。我已将_ "net/http/pprof"包含在我的导入中,并且我已经运行了http服务器:

router := createRouter()
server := &http.Server {
    Addr:           ":8080",
    Handler:        router,
    ReadTimeout:    15*time.Second,
    WriteTimeout:   15*time.Second,
//  MaxHeaderBytes: 4096,
}

log.Fatal(server.ListenAndServe())

当我尝试访问http://localhost:8080/debug/pprof/时,我得到404 page not found

这就是我在本地计算机上使用go tool pprof时得到的结果:

userver@userver:~/Desktop/gotest$ go tool pprof http://192.168.0.27:8080/
Use of uninitialized value $prefix in concatenation (.) or string at /usr/lib/go/pkg/tool/linux_amd64/pprof line 3019.
Read http://192.168.0.27:8080/pprof/symbol
Failed to get the number of symbols from http://192.168.0.27:8080/pprof/symbol

userver@userver:~/Desktop/gotest$ go tool pprof http://localhost:8080/debug/pprof/profile
Read http://localhost:8080/debug/pprof/symbol
Failed to get the number of symbols from http://localhost:8080/debug/pprof/symbol

远程客户端相同:

MacBookAir:~ apple$ go tool pprof http://192.168.0.27:8080/
Use of uninitialized value $prefix in concatenation (.) or string at /usr/local/Cellar/go/1.3.2/libexec/pkg/tool/darwin_amd64/pprof line 3027.
Read http://192.168.0.27:8080/pprof/symbol
Failed to get the number of symbols from http://192.168.0.27:8080/pprof/symbol

3 个答案:

答案 0 :(得分:16)

文档中未明确提及,但net/http/pprof仅使用http.DefaultServeMux注册其处理程序。

来自source

func init() {
        http.Handle("/debug/pprof/", http.HandlerFunc(Index))
        http.Handle("/debug/pprof/cmdline", http.HandlerFunc(Cmdline))
        http.Handle("/debug/pprof/profile", http.HandlerFunc(Profile))
        http.Handle("/debug/pprof/symbol", http.HandlerFunc(Symbol))
        http.Handle("/debug/pprof/trace", http.HandlerFunc(Trace))
}

如果你没有使用默认的多路复用器,你只需要用你正在使用的多路复用器注册你想要的任何/所有那些,例如像mymux.HandleFunc("…", pprof.Index)等等。

或者,您可以使用默认的多路复用器you've shown侦听单独的端口(也可能只在需要时绑定到localhost)。

答案 1 :(得分:12)

问题出现在我*mux.Router实例github.com/gorilla/mux Handlerhttp.Server使用的pprof中。

解决方案:只需为server := &http.Server { Addr: ":8080", Handler: router, ReadTimeout: 15*time.Second, WriteTimeout: 15*time.Second, } go func() { log.Println(http.ListenAndServe(":6060", nil)) }() log.Fatal(server.ListenAndServe()) 启动一个服务器:

div#curve>img {
  border: 0px solid #999;
  box-shadow: 0 0 0 0px #E5E4E2;
}

答案 2 :(得分:3)

如果您使用的是github.com/gorilla/mux.Router,则只需将前缀为/debug/的任何请求传递到http.DefaultServeMux

router := mux.NewRouter()
router.PathPrefix("/debug/").Handler(http.DefaultServeMux)