os_mon memsup reporting memory consumption

Serge Aleynikov serge@REDACTED
Tue Aug 29 19:27:00 CEST 2006

We had a few high memory watermark alarms in a production system running 
Linux reported by OS_MON whereas it seemed like the memory utilization 
on the server wasn't bad.  I looked at the implementation of the 
memsup.erl module in OS_MON, and I believe the calculation of allocated 
memory has a flow.

Memsup's code (sited at the end) reveals that allocated memory doesn't 
take in consideration cached memory.  Since cached memory can be quickly 
freed by the Linux memory manager if additional memory is needed by 
applications, it looks to me that it should be:

Allocated = MemFree + Cached

or even:

Allocated = MemFree + Buffers + Cached

This would be consistent with what "free" is showing on the "-/+ 
buffers/cache" line:

drp@REDACTED: ~$ uname -a
Linux drpdb02.corp.idt.net 2.6.9-5.ELsmp #1 SMP Wed Jan 5 19:30:39 EST 
2005 i686 i686 i386 GNU/Linux

drp@REDACTED: ~$ free
              total      used       free     shared    buffers     cached
Mem:       4150324   3416788     733536          0     282412    2621788
-/+ buffers/cache:    512588    3637736
Swap:      2048248         0    2048248

drp@REDACTED: ~$ head -4 /proc/meminfo
MemTotal:      4150324 kB
MemFree:        733536 kB
Buffers:        282412 kB
Cached:        2621788 kB

%% @spec get_memory_usage_linux() -> {Allocated, Total}
get_memory_usage_linux() ->
     Res = os:cmd("cat /proc/meminfo"),
     case get_memory_usage_linux(Res, undef, undef) of
	{MemTotal, MemFree} ->
	    {MemTotal-MemFree, MemTotal};
	error ->

get_memory_usage_linux(_Str, Tot, Free) when is_integer(Tot),
					     is_integer(Free) ->
     {Tot, Free};
get_memory_usage_linux("MemTotal:"++T, _Tot0, Free0) ->
     {ok, [N], Rest} = io_lib:fread("~d", T),
     Tot = N*1024,
     get_memory_usage_linux(skip_to_eol(Rest), Tot, Free0);
get_memory_usage_linux("MemFree:"++T, Tot0, _Free0) ->
     {ok, [N], Rest} = io_lib:fread("~d", T),
     Free = N*1024,
     get_memory_usage_linux(skip_to_eol(Rest), Tot0, Free);
get_memory_usage_linux("", _Tot0, _Free0) ->
get_memory_usage_linux(Str, Tot0, Free0) ->
     get_memory_usage_linux(skip_to_eol(Str), Tot0, Free0).



Serge Aleynikov
R&D Telecom, MIS, IDT Corp
Tel: +1 (973) 438-3436
Fax: +1 (973) 438-1464

More information about the erlang-questions mailing list