<https://lh3.googleusercontent.com/-vELZJKELDUs/WiJ_1zDqGUI/AAAAAAAABMo/U-3xe5_KqqwMwTRmYzBCjE7Nkr9Dfwk3wCLcBGAs/s1600/profile001.png>
I finally found the problem!!!

Since I am using a custom mux, I needed to register the pprof handler funcs 
to my custom router

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"))

Then, I started my benchmark (go-wrk) and then I started the pprof tool (go 
tool pprof http://localhost:4000/debug/pprof/heap)

<https://lh3.googleusercontent.com/-vELZJKELDUs/WiJ_1zDqGUI/AAAAAAAABMo/U-3xe5_KqqwMwTRmYzBCjE7Nkr9Dfwk3wCLcBGAs/s1600/profile001.png>
After hitting "web", I was granted this wonderful graph: 





Am Freitag, 1. Dezember 2017 18:52:21 UTC+1 schrieb basti skalendudler:
>
> Specifically, I wanted to see heap allocations generated by incoming 
> requests, so I can optimize my handler functions
>
> I will write a more basic webserver example to see if I can produce the 
> result I am expecting
>
> Am Donnerstag, 30. November 2017 14:39:56 UTC+1 schrieb Karan Chaudhary:
>>
>> Attaching png:
>>
>>
>> <https://lh3.googleusercontent.com/-3pu5f0Zvebw/WiAKKFjnVnI/AAAAAAAAKG4/hnPspzQzf7ASbvqtTU64rEMPSsZ3G1bzgCLcBGAs/s1600/profile003.png>
>>
>>
>> On Thursday, 30 November 2017 19:09:04 UTC+5:30, Karan Chaudhary wrote:
>>>
>>> Are you just trying to see how heap allocation can be seen using 
>>> debug/pprof?  
>>>
>>> Maybe you're allocating too less.  Try to allocate exponentialy.
>>>
>>> package main
>>>
>>> import (
>>> "log"
>>> "net/http"
>>> "time"
>>>
>>> _ "net/http/pprof"
>>> )
>>>
>>> func expalloc() {
>>> x := make([]int, 0)
>>> for i := 0; i < 10; i++ {
>>> x = append(x, i)
>>> x = append(x, x...)
>>> }
>>>
>>> time.Sleep(10 * time.Second)
>>> }
>>>
>>> func main() {
>>> go func() {
>>> log.Println(http.ListenAndServe("localhost:6060", nil))
>>> }()
>>>
>>> expalloc()
>>>
>>> }
>>>
>>> Allocations on my machine (reduce 50 to smaller number as the program 
>>> might go out of memory):
>>>
>>>
>>> <https://lh3.googleusercontent.com/-FqrfDyq6nRI/WiAJLLceTbI/AAAAAAAAKGw/AhU2-Tb-3dkJ9Wihr4iS7xynMq0r6sQCQCLcBGAs/s1600/profile003.png>
>>>
>>>
>>>
>>>
>>> On Wednesday, 29 November 2017 19:47:11 UTC+5:30, basti skalendudler 
>>> wrote:
>>>>
>>>> Does noone have an idea? :(
>>>>
>>>> Am Montag, 27. November 2017 13:37:43 UTC+1 schrieb basti skalendudler:
>>>>>
>>>>> The go tool pprof command is interactive, so I thought it is enough 
>>>>> type 'png' to get the image after the benchmark is run
>>>>>
>>>>> I tested to start go tool pprof now as well during and after the 
>>>>> benchmark -> nothing changes
>>>>>
>>>>> Am Montag, 27. November 2017 04:37:48 UTC+1 schrieb Karan Chaudhary:
>>>>>>
>>>>>> From the top of my head,  shouldn't the benchmark be done when 
>>>>>> traffic is being sent to the server and not before it is sent?
>>>>>>
>>>>>> On Sunday, 26 November 2017 00:11:40 UTC+5:30, basti skalendudler 
>>>>>> wrote:
>>>>>>>
>>>>>>> Hey guiys, I posted a StackOF question two days ago, but so far 
>>>>>>> nobody was able to help me!
>>>>>>>
>>>>>>> I am trying to profile my web server I wrote, but my pprof does not 
>>>>>>> contain any data about the handler func.  
>>>>>>> I am using the httprouter package 
>>>>>>> <https://github.com/julienschmidt/httprouter> by julienschmidt, and 
>>>>>>> want to simply benchmark one of my handlers and see the pprof profile 
>>>>>>> for 
>>>>>>> that. For the benchmarking, I am using go-wrk 
>>>>>>> <https://github.com/tsliwowicz/go-wrk>  
>>>>>>>
>>>>>>> I set up my web server and pprof like this:
>>>>>>>
>>>>>>>    
>>>>>>>  // 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)
>>>>>>>  }
>>>>>>>
>>>>>>>
>>>>>>> The router is initialized like this:
>>>>>>>
>>>>>>>   
>>>>>>>   // Create the httprouter
>>>>>>>  router := httprouter.New()
>>>>>>>  // Register all handlers
>>>>>>>  router.GET("/entities/:type/map", h.UseHandler(&h.
>>>>>>> ApiGetEntitiesMapRequest{}, p))
>>>>>>>
>>>>>>>
>>>>>>> And my handler looks like this:
>>>>>>>
>>>>>>>    
>>>>>>>  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
>>>>>>> }
>>>>>>>
>>>>>>> This handler is just a test, where I dynamically append a lot of 
>>>>>>> elements to a slice. The reason for that is, I wanted to test whether 
>>>>>>> these 
>>>>>>> dynamic allocations are represented in the heap profile of pprof.
>>>>>>>
>>>>>>> Now, what I did was: 
>>>>>>>  
>>>>>>>  - Start my server  
>>>>>>>  - execute **go tool pprof http://localhost:6060/debug/pprof/heap** 
>>>>>>> in my terminal  
>>>>>>>  - then benchmark my handler by executing **go-wrk -no-c -d 5 
>>>>>>> http://localhost:4000/entities/object/map**  
>>>>>>>
>>>>>>> The request works and my benchmark also reports everything 
>>>>>>> correctly. However, when I type **png** in the pprof terminal, I get 
>>>>>>> this 
>>>>>>> graph:
>>>>>>>
>>>>>>>
>>>>>>> <https://lh3.googleusercontent.com/-H5BlDsvkGc8/WhkpNlbAgBI/AAAAAAAABMQ/MagwiySh4F8G5NvT4V4_uTAnHexw0VqBACLcBGAs/s1600/profile001.png>
>>>>>>>
>>>>>>>
>>>>>>> The graph does not contain any information about my handler and the 
>>>>>>> costly heap allocations I did in my handler. What am I doing wrong?
>>>>>>>
>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to