如何连续剖析我的go应用程序?

My application is having some memory leaks which makes the application crash often. So I started profiling my application with pprof, but I can get the profile only at the instance I hit the url. Are there any ways to find the profile at some intervals so that I can analyze what's happening with the application?

I was hoping that there would be a cool flag to pprof dump on exception (like core dump) but can't find anything. Pending this there are two options that come to mind:

  • External: curl pprof regularly using cron or some other driver
  • Internal: write pprof regularly from inside the program

External

$ curl http://localhost:8080/debug/pprof/heap > heap.0.pprof

Internal

ticker := time.NewTicker(1 * time.Hour)
go func() {
    for {
       select {
        case <- ticker.C:
if err := pprof.WriteHeapProfile(f); err != nil {
            log.Fatal("could not write memory profile: ", err)
        }

       }
    }
}()

The external curl is a strategy I often take in order to get heap profiles at regular intervals in order to track/compare memory growth.