[erlang-questions] How can I release beam process memory?

Dániel Szoboszlay dszoboszlay@REDACTED
Sat Jan 14 21:47:07 CET 2017


Hi Jack,

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).

You can check with recon_alloc
<https://ferd.github.io/recon/recon_alloc.html> how much unused memory is
lost due to fragmentation in the various allocators.

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.

However, if the memory is wasted in the eheap_alloc, 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.

Cheers,
Daniel

On Sat, 14 Jan 2017 at 08:04 Jack Tang <himars@REDACTED> wrote:

> Hello list,
>
> I run one Erlang application on Debian server and today I find the beam
> process consumes around 35G memory by `top` command.
>
> ```
> KiB Mem:  99194912 total, 61682656 used, 37512252 free,   397380 buffers
> KiB Swap:        0 total,        0 used,        0 free. 18684864 cached Mem
>
>   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
> 11858 usr1   20   0 36.850g 0.032t   6220 S  73.5 34.4   8038:49 beam.smp
> ```
>
> 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:
>
> ```
> lists:foreach(fun(E) -> PId = element(2, E), erlang:garbage_collect(PId)
> end, supervisor:which_children(some_thing_sup)).
> ```
>
> and erlang:memory() decreases from 32G to 23G.
> ```
> [{total,22982011544},
>  {processes,12884182336},
>  {processes_used,12884170336},
>  {system,10097829208},
>  {atom,13828705},
>  {atom_used,13796692},
>  {binary,170530288},
>  {code,16450626},
>  {ets,9637717576}]
> ```
>
> However, when I input `top` command, the beam process still takes 35G
> memory. What can I do to release the 9G memory? Thanks
>
> BR
> -Jack
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170114/3ad973b3/attachment.htm>


More information about the erlang-questions mailing list