我正在尝试分析我编写的 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 的堆配置文件中表示。
现在,我所做的是:
- 启动我的服务器
- 在我的终端中 执行go tool pprof http://localhost:6060/debug/pprof/heap
- 然后通过执行go-wrk -no-c -d 5 http://localhost:4000/entities/object/map对我的处理程序进行基准测试
该请求有效,我的基准测试也正确报告了所有内容。但是,当我在 pprof 终端中键入png时,我得到了这个图。
该图不包含有关我的处理程序的任何信息以及我在处理程序中所做的昂贵的堆分配。我究竟做错了什么?