2017-11-23 4 views
0

私のWebサーバをプロファイルしようとしていますが、私のpprofにはハンドラfuncに関するデータが含まれていません。
私はjulienschmidtによってhttprouter packageを使用しています。私のハンドラのベンチマークを行い、そのためのpprofプロファイルを参照してください。ベンチマークのために、私はgo-wrkjulienschmidtrouterのpprofプロファイルとハンドリングのプロファイリングではないベンチマーク

を使用しています私はこのように私のウェブサーバと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のヒーププロファイルで表されているかどうかをテストしたかったからです。

さて、私がやったことだった。

ご要望と私のベンチマークもお伝えしますすべて正しく動作します。しかし、pngをpprofターミナルに入力すると、このグラフはenter image description hereになります。

グラフには、自分のハンドラと、ハンドラで行った高価なヒープ割り当てに関する情報は含まれていません。私は間違って何をしていますか?

答えて

0

だから、私はついにこの問題を発見しました!

あなたの要求を処理するためのカスタムマルチプレクサを使用している場合は、プロファイリングが権利を取得するためには、あなたのMUXに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")) 

は今、私は私の望ましい結果を得ました!

関連する問題