Great find!

On Saturday, 2 December 2017 15:57:18 UTC+5:30, basti skalendudler wrote:
>
>
> <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