0

我正在尝试分析我编写的 Web 服务器,但我的 pprof 不包含有关处理程序 func 的任何数据。
我正在使用 julienschmidt 的httprouter 包,并且想简单地对我的一个处理程序进行基准测试并查看 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在此处输入图像描述时,我得到了这个图。

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

4

1 回答 1

1

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

如果您使用自定义多路复用器来处理您的请求,则需要将 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"))

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

于 2017-12-02T10:28:09.753 回答