And https://blog.golang.org/pprof
> On Mar 19, 2020, at 9:27 AM, Robert Engels <reng...@ix.netcom.com> wrote: > > > https://www.freecodecamp.org/news/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase-4bec4325e192/amp/ > >>> On Mar 19, 2020, at 9:24 AM, Nitish Saboo <nitish.sabo...@gmail.com> wrote: >>> >> >> Hi, >> >> Are there any other commands that provide an exact allocation of memory for >> each of the functions or help to analyze the memory allocation much better? >> >> Thanks, >> Nitish >> >>> On Thu, Mar 19, 2020 at 7:08 PM Robert Engels <reng...@ix.netcom.com> wrote: >>> You are only using 1.5 mb on the Go side... so if your process is consuming >>> lots of memory it’s on the C side. >>> >>>>> On Mar 19, 2020, at 7:55 AM, Nitish Saboo <nitish.sabo...@gmail.com> >>>>> wrote: >>>>> >>>> >>>> Hi Michael, >>>> >>>> I used something like this to generate a mem-prof for 60 minutes >>>> >>>> func main() { >>>> flag.Parse() >>>> if *cpuprofile != "" { >>>> f, err := os.Create(*cpuprofile) >>>> if err != nil { >>>> fmt.Println("could not create CPU profile: ", err) >>>> } >>>> defer f.Close() // error handling omitted for example >>>> if err := pprof.StartCPUProfile(f); err != nil { >>>> fmt.Print("could not start CPU profile: ", err) >>>> } >>>> defer pprof.StopCPUProfile() >>>> } >>>> timeout := time.After(60 * time.Minute) >>>> A_chan := make(chan bool) >>>> B_chan := make(chan bool) >>>> go util.A(A_chan) >>>> go util.B(B_chan) >>>> (..Rest of the code..) >>>> >>>> for { >>>> select { >>>> case <-A_chan: >>>> continue >>>> case <-B_chan: >>>> continue >>>> case <-timeout: >>>> break >>>> } >>>> break >>>> } >>>> >>>> if *memprofile != "" { >>>> count = count + 1 >>>> fmt.Println("Generating Mem Profile:") >>>> fmt.Print(count) >>>> f, err := os.Create(*memprofile) >>>> if err != nil { >>>> fmt.Println("could not create memory profile: ", err) >>>> } >>>> defer f.Close() // error handling omitted for example >>>> runtime.GC() // get up-to-date statistics >>>> if err := pprof.WriteHeapProfile(f); err != nil { >>>> fmt.Println("could not write memory profile: ", err) >>>> } >>>> >>>> } >>>> } >>>> >>>> I got the following output from the mem.prof: >>>> >>>> ~/Desktop/memprof:go tool pprof mem.prof >>>> File: main >>>> Build ID: 331d79200cabd2a81713918e51b8c9a63e3f7d29 >>>> Type: inuse_space >>>> Time: Mar 19, 2020 at 3:57pm (IST) >>>> Entering interactive mode (type "help" for commands, "o" for options) >>>> (pprof) top 14 >>>> Showing nodes accounting for 1581.40kB, 100% of 1581.40kB total >>>> flat flat% sum% cum cum% >>>> 1024.14kB 64.76% 64.76% 1024.14kB 64.76% >>>> github.com/aws/aws-sdk-go/aws/endpoints.init.ializers >>>> 557.26kB 35.24% 100% 557.26kB 35.24% crypto/elliptic.initTable >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/elliptic.(*p256Point).p256BaseMult >>>> 0 0% 100% 557.26kB 35.24% crypto/elliptic.GenerateKey >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/elliptic.p256Curve.ScalarBaseMult >>>> 0 0% 100% 557.26kB 35.24% crypto/tls.(*Conn).Handshake >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/tls.(*Conn).clientHandshake >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/tls.(*clientHandshakeState).doFullHandshake >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/tls.(*clientHandshakeState).handshake >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/tls.(*ecdheKeyAgreement).processServerKeyExchange >>>> 0 0% 100% 557.26kB 35.24% >>>> crypto/tls.generateECDHEParameters >>>> 0 0% 100% 557.26kB 35.24% >>>> net/http.(*persistConn).addTLS.func2 >>>> 0 0% 100% 1024.14kB 64.76% runtime.main >>>> 0 0% 100% 557.26kB 35.24% sync.(*Once).Do >>>> >>>> (pprof) >>>> >>>> Can you please share some commands or any link which I can refer to to >>>> analyze the data? >>>> >>>> Thanks, >>>> Nitish >>>> >>>> >>>> >>>>> On Fri, Mar 13, 2020 at 6:22 PM Michael Jones <michael.jo...@gmail.com> >>>>> wrote: >>>>> hi. get the time at the start, check the elapsed time in your infinite >>>>> loop, and trigger the write/exit after a minute, 10 minutes, 100 minutes, >>>>> ... >>>>> >>>>>> On Fri, Mar 13, 2020 at 5:45 AM Nitish Saboo <nitish.sabo...@gmail.com> >>>>>> wrote: >>>>>> Hi Michael, >>>>>> >>>>>> Thanks for your response. >>>>>> >>>>>> That code looks wrong. I see the end but not the start. Look here and >>>>>> copy carefully: >>>>>> >>>>>> >>Since I did not want cpu profiling I omitted the start of the code and >>>>>> >>just added memory profiling part. >>>>>> >>>>>> Call at end, on way out. >>>>>> >>>>>> >>Oh yes, I missed that.I have to call memory profiling code at the end >>>>>> >>on the way out.But the thing is that it runs as a service in infinite >>>>>> >>for loop. >>>>>> >>>>>> func main() { >>>>>> flag.Parse() >>>>>> if *cpuprofile != "" { >>>>>> f, err := os.Create(*cpuprofile) >>>>>> if err != nil { >>>>>> fmt.Println("could not create CPU profile: ", err) >>>>>> } >>>>>> defer f.Close() // error handling omitted for example >>>>>> if err := pprof.StartCPUProfile(f); err != nil { >>>>>> fmt.Print("could not start CPU profile: ", err) >>>>>> } >>>>>> defer pprof.StopCPUProfile() >>>>>> } >>>>>> >>>>>> A_chan := make(chan bool) >>>>>> B_chan := make(chan bool) >>>>>> go util.A(A_chan) >>>>>> go util.B(B_chan) >>>>>> (..Rest of the code..) >>>>>> >>>>>> for { >>>>>> select { >>>>>> case <-A_chan: >>>>>> continue >>>>>> case <-B_chan: >>>>>> continue >>>>>> >>>>>> } >>>>>> } >>>>>> >>>>>> } >>>>>> >>>>>> What would be the correct way to add the memprofile code changes, since >>>>>> it is running in an infinite for loop ? >>>>>> >>>>>> Also, as shared by others above, there are no promises about how soon >>>>>> the dead allocations go away, The speed gets faster and faster version >>>>>> to version, and is impressive indeed now, so old versions are not the >>>>>> best to use, ubt even so, if the allocation feels small to th GC the >>>>>> urgency to free it will be low. You need to loop in allocating and see >>>>>> if the memory grows and grows. >>>>>> >>>>>> >> Yes, got it.I will try using the latest version of Go and check the >>>>>> >> behavior. >>>>>> >>>>>> Thanks, >>>>>> Nitish >>>>>> >>>>>>> On Fri, Mar 13, 2020 at 6:20 AM Michael Jones <michael.jo...@gmail.com> >>>>>>> wrote: >>>>>>> That code looks wrong. I see the end but not the start. Look here and >>>>>>> copy carefully: >>>>>>> https://golang.org/pkg/runtime/pprof/ >>>>>>> >>>>>>> Call at end, on way out. >>>>>>> >>>>>>> Also, as shared by others above, there are no promises about how soon >>>>>>> the dead allocations go away, The speed gets faster and faster version >>>>>>> to version, and is impressive indeed now, so old versions are not the >>>>>>> best to use, ubt even so, if the allocation feels small to th GC the >>>>>>> urgency to free it will be low. You need to loop in allocating and see >>>>>>> if the memory grows and grows. >>>>>>> >>>>>>>> On Thu, Mar 12, 2020 at 9:22 AM Nitish Saboo >>>>>>>> <nitish.sabo...@gmail.com> wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> I have compiled my Go binary against go version 'go1.7 linux/amd64'. >>>>>>>> I added the following code change in the main function to get the >>>>>>>> memory profiling of my service >>>>>>>> >>>>>>>> var memprofile = flag.String("memprofile", "", "write memory profile >>>>>>>> to `file`") >>>>>>>> >>>>>>>> func main() { >>>>>>>> flag.Parse() >>>>>>>> if *memprofile != "" { >>>>>>>> f, err := os.Create(*memprofile) >>>>>>>> if err != nil { >>>>>>>> fmt.Println("could not create memory profile: ", err) >>>>>>>> } >>>>>>>> defer f.Close() // error handling omitted for example >>>>>>>> runtime.GC() // get up-to-date statistics >>>>>>>> if err := pprof.WriteHeapProfile(f); err != nil { >>>>>>>> fmt.Println("could not write memory profile: ", err) >>>>>>>> } >>>>>>>> } >>>>>>>> .. >>>>>>>> .. >>>>>>>> (Rest code to follow) >>>>>>>> >>>>>>>> I ran the binary with the following command: >>>>>>>> >>>>>>>> nsaboo@ubuntu:./main -memprofile=mem.prof >>>>>>>> >>>>>>>> After running the service for couple of minutes, I stopped it and got >>>>>>>> the file 'mem.prof' >>>>>>>> >>>>>>>> 1)mem.prof contains the following: >>>>>>>> >>>>>>>> nsaboo@ubuntu:~/Desktop/memprof$ vim mem.prof >>>>>>>> >>>>>>>> heap profile: 0: 0 [0: 0] @ heap/1048576 >>>>>>>> >>>>>>>> # runtime.MemStats >>>>>>>> # Alloc = 761184 >>>>>>>> # TotalAlloc = 1160960 >>>>>>>> # Sys = 3149824 >>>>>>>> # Lookups = 10 >>>>>>>> # Mallocs = 8358 >>>>>>>> # Frees = 1981 >>>>>>>> # HeapAlloc = 761184 >>>>>>>> # HeapSys = 1802240 >>>>>>>> # HeapIdle = 499712 >>>>>>>> # HeapInuse = 1302528 >>>>>>>> # HeapReleased = 0 >>>>>>>> # HeapObjects = 6377 >>>>>>>> # Stack = 294912 / 294912 >>>>>>>> # MSpan = 22560 / 32768 >>>>>>>> # MCache = 2400 / 16384 >>>>>>>> # BuckHashSys = 2727 >>>>>>>> # NextGC = 4194304 >>>>>>>> # PauseNs = [752083 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >>>>>>>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] >>>>>>>> # NumGC = 1 >>>>>>>> # DebugGC = false >>>>>>>> >>>>>>>> 2)When I tried to open the file using the following command, it just >>>>>>>> goes into interactive mode and shows nothing >>>>>>>> >>>>>>>> a)Output from go version go1.7 linux/amd64 for mem.prof >>>>>>>> >>>>>>>> nsaboo@ubuntu:~/Desktop/memprof$ go tool pprof mem.prof >>>>>>>> Entering interactive mode (type "help" for commands) >>>>>>>> (pprof) top >>>>>>>> profile is empty >>>>>>>> (pprof) >>>>>>>> >>>>>>>> b)Output from go version go1.12.4 linux/amd64 for mem.prof >>>>>>>> >>>>>>>> nsaboo@ubuntu:~/Desktop/memprof$ go tool pprof mem.prof >>>>>>>> Type: space >>>>>>>> No samples were found with the default sample value type. >>>>>>>> Try "sample_index" command to analyze different sample values. >>>>>>>> Entering interactive mode (type "help" for commands, "o" for options) >>>>>>>> (pprof) o >>>>>>>> call_tree = false >>>>>>>> compact_labels = true >>>>>>>> cumulative = flat //: [cum | flat] >>>>>>>> divide_by = 1 >>>>>>>> drop_negative = false >>>>>>>> edgefraction = 0.001 >>>>>>>> focus = "" >>>>>>>> granularity = functions //: [addresses | >>>>>>>> filefunctions | files | functions | lines] >>>>>>>> hide = "" >>>>>>>> ignore = "" >>>>>>>> mean = false >>>>>>>> nodecount = -1 //: default >>>>>>>> nodefraction = 0.005 >>>>>>>> noinlines = false >>>>>>>> normalize = false >>>>>>>> output = "" >>>>>>>> prune_from = "" >>>>>>>> relative_percentages = false >>>>>>>> sample_index = space //: [objects | >>>>>>>> space] >>>>>>>> show = "" >>>>>>>> show_from = "" >>>>>>>> tagfocus = "" >>>>>>>> taghide = "" >>>>>>>> tagignore = "" >>>>>>>> tagshow = "" >>>>>>>> trim = true >>>>>>>> trim_path = "" >>>>>>>> unit = minimum >>>>>>>> (pprof) space >>>>>>>> (pprof) sample_index >>>>>>>> (pprof) top >>>>>>>> Showing nodes accounting for 0, 0% of 0 total >>>>>>>> flat flat% sum% cum cum% >>>>>>>> >>>>>>>> >>>>>>>> 3)Please let me know if it is this the correct way of getting the >>>>>>>> memory profiling ? >>>>>>>> >>>>>>>> 4)Can we deduce something from this memory stats that points us to >>>>>>>> increase in memory usage? >>>>>>>> >>>>>>>> 5)I am just thinking out loud, since I am using go1.7, can that be the >>>>>>>> reason for the issue of increase in memory usage that might get fixed >>>>>>>> with latest go versions ? >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Nitish >>>>>>>> >>>>>>>>> On Tue, Mar 10, 2020 at 6:56 AM Jake Montgomery <jake6...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> On Monday, March 9, 2020 at 1:37:00 PM UTC-4, Nitish Saboo wrote: >>>>>>>>>> Hi Jake, >>>>>>>>>> >>>>>>>>>> The memory usage remains constant when the rest of the service is >>>>>>>>>> running.Only when LoadPatternDB() method is called within the >>>>>>>>>> service, Memory Consumption increases which actually should not >>>>>>>>>> happen. >>>>>>>>>> I am assuming if there is a memory leak while calling this method >>>>>>>>>> because the memory usage then becomes constant after getting >>>>>>>>>> increased and then further increases on next call. >>>>>>>>> >>>>>>>>> Its possible that I am not fully understanding, perhaps a language >>>>>>>>> problem. But from what you have written above I still don't see that >>>>>>>>> this means you definitely have a memory leak. To test for that you >>>>>>>>> would need to continuously call LoadPatternDB() and monitor memory >>>>>>>>> for a considerable time. If it eventually stabilizes to a constant >>>>>>>>> range then there is no leak, just normal Go-GC variation. If it never >>>>>>>>> stops climbing, and eventually consumes all the memory, then it would >>>>>>>>> probably be a leak. Just because it goes up after one call, or a few >>>>>>>>> calls doe not mean there is a leak. >>>>>>>>> -- >>>>>>>>> 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. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/golang-nuts/f897fdb1-8968-4435-9fe9-02e167e09a36%40googlegroups.com. >>>>>>>> >>>>>>>> -- >>>>>>>> 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. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/golang-nuts/CALjMrq6DC98p4M4V2QCbQFTcsL1PtOWELvg8MEcMYj9EM9ui_A%40mail.gmail.com. >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Michael T. Jones >>>>>>> michael.jo...@gmail.com >>>>> >>>>> >>>>> -- >>>>> Michael T. Jones >>>>> michael.jo...@gmail.com >>>> >>>> -- >>>> 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. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/golang-nuts/CALjMrq5-gjzMUKAgWjUjJFYRFVyrctT5p-Sesd_f%3DRR-h9-39A%40mail.gmail.com. > -- > 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. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/D02AE06E-1289-4B3F-A65F-913E885EFF58%40ix.netcom.com. -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/8EB9FBBB-91FA-43D2-B741-B6A67458D29C%40ix.netcom.com.