<div dir="ltr">Hello,<div><br></div><div>In the memory issue investigation, I find something interesting. As I mentioned, </div><div>we usually adopted remote Erlang shell to interactive with nodes in production. </div><div>Sometime we use mnesia:select(...) to return some query result, and it may contain </div><div>billions of rows. And we leave the remote shell alive. I find the query results do </div><div>consume the memory of remote node, since the return value is referenced. In the </div><div>shell, we still can access it using `v(N)` command. I tried `f()` command, and it only </div><div>unbinds the variables. So what's the mechanism of Erlang shell gc? Thanks.</div><div><br></div><div>BR</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 15, 2017 at 2:09 PM, Jack Tang <span dir="ltr"><<a href="mailto:himars@gmail.com" target="_blank">himars@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Daniel<div><br></div><div>Thank you for the clue and excellent recon toolkits! I would like dig it deeper  :)</div><div><br></div><div>BR</div><div>-Jack<br><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">On Sun, Jan 15, 2017 at 4:47 AM, Dániel Szoboszlay <span dir="ltr"><<a href="mailto:dszoboszlay@gmail.com" target="_blank">dszoboszlay@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Jack,<div><br></div><div>I guess the 9 GB is lost due to memory fragmentation. Erlang allocates memory in large chunks called carriers from the OS, then places the blocks your program actually needs on these carriers. A carrier can only be returned to the OS once all the blocks on it have been freed (and even then, the memory allocator may decide to keep it around for a while in case more memory is needed).</div><div><br></div><div>You can check with <a href="https://ferd.github.io/recon/recon_alloc.html" target="_blank">recon_alloc</a> how much unused memory is lost due to fragmentation in the various allocators.</div><div><br></div><div>The bad news is that you cannot defragment the carriers, and if the selected memory allocator strategy doesn't work well for your application, you cannot change it either without restarting the emulator.</div><div><br></div><div>However, if the memory is wasted in the <font face="monospace">eheap_alloc</font>, you may try to force a GC on all processes a couple of times. As the GC copies the memory, it will allocate new blocks and free up the old heap blocks. So there's a chance the allocators can compact the blocks together on fewer segments. But that's just a guess, it may or may not work at all.</div><div><br></div><div>Cheers,</div><div>Daniel</div></div><br><div class="gmail_quote"><div><div class="m_-7605590271286733619h5"><div dir="ltr">On Sat, 14 Jan 2017 at 08:04 Jack Tang <<a href="mailto:himars@gmail.com" target="_blank">himars@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-7605590271286733619h5"><div dir="ltr" class="m_-7605590271286733619m_-914112451667995569gmail_msg"><span style="font-size:12.8px" class="m_-7605590271286733619m_-914112451667995569gmail_msg">Hello list,</span><div style="font-size:12.8px" class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div style="font-size:12.8px" class="m_-7605590271286733619m_-914112451667995569gmail_msg">I run one Erlang application on Debian server and today I find the beam process consumes around 35G memory by `top` command.</div><div style="font-size:12.8px" class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div style="font-size:12.8px" class="m_-7605590271286733619m_-914112451667995569gmail_msg"><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">KiB Mem:  99194912 total, 61682656 used, 37512252 free,   397380 buffers</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">KiB Swap:        0 total,        0 used,        0 free. 18684864 cached Mem</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">11858 usr1   20   0 36.850g 0.032t   6220 S  73.5 34.4   8038:49 beam.smp</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">I connect to the Erlang application using remote shell and find the mem-leaked supervisor tree and run gc on the whole tree. Code looks like blow:</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">lists:foreach(fun(E) -> PId = element(2, E), erlang:garbage_collect(PId) end, supervisor:which_children(some<wbr>_thing_sup)).<br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">and erlang:memory() decreases from 32G to 23G.</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">[{total,22982011544},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {processes,12884182336},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {processes_used,12884170336},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {system,10097829208},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {atom,13828705},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {atom_used,13796692},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {binary,170530288},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {code,16450626},</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"> {ets,9637717576}]</div></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">```</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">However, when I input `top` command, the beam process still takes 35G memory. What can I do to release the 9G memory? Thanks</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg"><br class="m_-7605590271286733619m_-914112451667995569gmail_msg"></div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">BR</div><div class="m_-7605590271286733619m_-914112451667995569gmail_msg">-Jack</div></div></div></div></div>
______________________________<wbr>_________________<br class="m_-7605590271286733619m_-914112451667995569gmail_msg">
erlang-questions mailing list<br class="m_-7605590271286733619m_-914112451667995569gmail_msg">
<a href="mailto:erlang-questions@erlang.org" class="m_-7605590271286733619m_-914112451667995569gmail_msg" target="_blank">erlang-questions@erlang.org</a><br class="m_-7605590271286733619m_-914112451667995569gmail_msg">
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" class="m_-7605590271286733619m_-914112451667995569gmail_msg" target="_blank">http://erlang.org/mailman/list<wbr>info/erlang-questions</a><br class="m_-7605590271286733619m_-914112451667995569gmail_msg">
</blockquote></div>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div class="m_-7605590271286733619gmail_signature" data-smartmail="gmail_signature">Jack Tang<br><br><br><a href="http://www.linkedin.com/in/jacktang" target="_blank">http://www.linkedin.com/in/<wbr>jacktang</a><br></div>
</font></span></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Jack Tang<br><br><br><a href="http://www.linkedin.com/in/jacktang" target="_blank">http://www.linkedin.com/in/jacktang</a><br></div>
</div></div>