Sounds like it. Probably in the C code. You need to check that your 
release/free code is correct. 

You can try a similar C program that instantiates and frees the structure to 
check for similar behavior. 

> On Mar 16, 2020, at 8:25 AM, Nitish Saboo <nitish.sabo...@gmail.com> wrote:
> 
> 
> Hi,
> 
> I upgraded the go version and compiled the binary against go version 'go 
> version go1.12.4 linux/amd64'.
> I ran the program for some time. I made almost 30-40 calls to the method 
> Load_Pattern_Db().
> The program starts with 6% Mem Usage. The memory usage increases only when I 
> call 'LoadPatternDb()' method and LoadPatternDb() method is called by a 
> goroutine at regular intervals of 3 minutes(making use of ticker here ).
> 
> What I observed is:
> 
> 1)After almost 16-17 calls to the method 'LoadPatternDb(), the memory usage 
> got almost constant at 29%. But I did not expect the program to take this 
> much memory.
>    When I restart the service the Mem Usage again starts with 6%.
> 
> a) Is this the sign of memory leaking?
> 
> b) Till this moment I did not see memory getting reclaimed or going down but 
> it did become constant.
> As mentioned by experts above, the same sort of behavior is seen here. But I 
> did not expect the memory usage to grow this much. Is this expected?
> 
> 2)I will run mem-profiling at intervals(10 minutes, 100 minutes..etc) as 
> mentioned in the earlier email.
> 
> a) Which all mem-stats variables should I look into for debugging this kind 
> of behavior?
> 
> 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/CALjMrq7QiVa54kcgZo8mjBf2g8KWQbjGGnt4HCP6o4FA43--hg%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/D78ADFAA-9912-4A68-BF98-E6E12753BADD%40ix.netcom.com.

Reply via email to