[erlang-questions] Relationship between erlang:memory/1, ets:info/2 and erlang:process_info/2

Rickard Green rickard@REDACTED
Mon Sep 24 01:34:45 CEST 2012


On Sep 21, 2012, at 6:50 PM, Simon MacMullen wrote:

> I'm trying to write something that will account for memory use on a RabbitMQ system. To do this I'm trying to match up the numbers I get out of erlang:memory(ets) and ets:info(T, memory), and erlang:memory(processes) and erlang:process_info/2.
> 
> And it doesn't make a huge amount of sense to me. I don't expect things to match up perfectly, of course there will be some memory unaccounted for, but the ETS numbers in particular can be quite off:
> 
> 1> erlang:memory(ets).
> 2120291872
> 
> 2> lists:sum([ets:info(T, memory) || T <- ets:all()]) * erlang:system_info(wordsize).
> 1874292776
> 
> So I have ~2GB of ETS memory, and ~230MB unaccounted for. Should I expect these to match up closer?
> 

The main structure of an ets table is erroneously accounted for twice in the erlang:memory(ets) case. :-(

> And then...
> 
> 3> erlang:memory(processes).
> 1519425156
> 
> 4> lists:sum([element(2, process_info(P, memory)) || P <- processes()]). 
> 1552852008
> 
> So for processes there is less in total than if you add them all up. Is some memory shared? (Are we counting binaries and atoms in there as well?)
> 

This can happen when there are a lot of outstanding messages.

> Is there a way to get this sort of information in a more consistent manner?
> 

The ets case above will be fixed. In the process case I haven't decided what to do, yet, but something will be done.

erlang:memory/[0,1] use a very different (and cheaper) strategy than ets:info() and process_info(). The results will more or less always differ, and should since there are memory allocated that isn't for any specific process or ets-table in the erlang:memory() case.

If you want to know memory used for all processes or all ets-tables use erlang:memory(). Much cheaper (both from the callers perspective, and especially from an overall performance perspective), as well as generally a more true value.

Summing up results of process_info(), or ets:info() will, of course, not give you a consistent snapshot of the memory usage at one point in time. Note that the same is true in the erlang:memory() case. The result is the sum of memory usage in different allocator instances that have been read at different (but close) points in time.

Regards,
Rickard Green, Erlang/OTP, Ericsson AB

> Cheers, Simon
> 
> -- 
> Simon MacMullen
> RabbitMQ, VMware
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list