pprof配置文件与julienschmidtrouter和基准测试不分析处理程序

时间:2017-11-23 09:54:20

标签: go webserver benchmarking pprof

我正在尝试配置我编写的Web服务器,但我的pprof不包含有关处理程序功能的任何数据。
我正在使用julienschmidt的httprouter package,并希望简单地对我的一个处理程序进行基准测试,并查看pprof配置文件。对于基准测试,我使用的是go-wrk

我设置了我的网络服务器和pprof:

// Configure the server
server := &http.Server{
    Addr:    ":4000",
    Handler: router,
}

go func() {
    log.Println(http.ListenAndServe(":6060", nil))
}()

// Start the server
err = server.ListenAndServe()
if err != nil {
    panic(err)
}

路由器初始化如下:

// Create the httprouter
router := httprouter.New()
// Register all handlers
router.GET("/entities/:type/map", h.UseHandler(&h.ApiGetEntitiesMapRequest{}, p))

我的处理程序看起来像这样:

func (req ApiGetEntitiesMapRequest) Handle(r *http.Request, hrp httprouter.Params, p Params) (interface{}, error) {
    test := make([]string, 0)
    for i := 0; i < 1000; i++ {
        test = append(test, "1")
        test = append(test, "2")
        // Ensure pprof has some time to collect its data
        time.Sleep(10)
    }
    return test, nil
}

这个处理程序只是一个测试,我动态地将很多元素附加到切片上。原因是,我想测试这些动态分配是否在pprof的堆配置文件中表示。

现在,我做的是:

请求有效,我的基准也会正确报告所有内容。但是,当我在pprof终端中输入 png 时,我会得到此图enter image description here

该图不包含有关我的处理程序的任何信息以及我在处理程序中执行的昂贵的堆分配。我做错了什么?

1 个答案:

答案 0 :(得分:0)

所以,我终于找到了问题!

如果您使用自定义多路复用器来处理请求,则需要将pprof处理程序注册到多路复用器,以便正确地进行分析:

router.HandlerFunc(http.MethodGet, "/debug/pprof/", pprof.Index)
router.HandlerFunc(http.MethodGet, "/debug/pprof/cmdline", pprof.Cmdline)
router.HandlerFunc(http.MethodGet, "/debug/pprof/profile", pprof.Profile)
router.HandlerFunc(http.MethodGet, "/debug/pprof/symbol", pprof.Symbol)
router.HandlerFunc(http.MethodGet, "/debug/pprof/trace", pprof.Trace)
router.Handler(http.MethodGet, "/debug/pprof/goroutine", pprof.Handler("goroutine"))
router.Handler(http.MethodGet, "/debug/pprof/heap", pprof.Handler("heap"))
router.Handler(http.MethodGet,"/debug/pprof/threadcreate", pprof.Handler("threadcreate"))
router.Handler(http.MethodGet,"/debug/pprof/block", pprof.Handler("block"))

现在我得到了我想要的结果!