Fl4m3Ph03n1x
:memsup and BEAM memory consumption
Background
I am testing an application where I perform some actions depending on the amount of memory the machine has free. To supervise the machine’s memory I am using :memsup.get_memory_data/0 but I am getting some really weird results.
Problem
I am have a machine with 8GB of RAM, which should be more than enough for opening iex and doing some tests. However, :memsup always returns absurd results like the following:
iex(9)> {total, allocated, _worse} = :memsup.get_memory_data()
{8235098112, 7862636544, {#PID<0.118.0>, 372944}}
iex(10)> (allocated / total) * 100
95.47714474151489
No matter what I do, I always have :memsup report BEAM is using up to 95% of my machine’s memory. All I have open is a single session of iex that I am using as a playground.
What’s even more weird is that htop returns me a completely different value of memory usage, stating I am using 6.22GB out of 7.67GB, which still doesn’t hold up to 95% usage…
(6.22 / 7.67) * 100
81.09517601043025
Questions
So now I have some questions:
- Does
:memsupeven work? - Why are the values
:memsupgives me so different? - Why is BEAM using over 90% of the total memory if all I have is a simple
iexshell session open? - Is there a reliable way to know if my machine is struggling with memory?
Marked As Solved
peerreynders
I wonder if the numbers seem off because total reports physical memory while allocated includes(?) cached memory.
memsup seems to be designed to pinpoint individual processes that are heavy memory users - the rest of the functionality seems to just report information reported by the OS.
You may want to look into recon (possibly via one of the Elixir wrappers) - see page 41 of Erlang in Anger
Also Liked
spencerdcarlson
To piggy back off of this, it looks like recon_alloc:memory/1 has the answers.
:recon_alloc.memory(:usage)








