Saturday, September 13, 2008

Display free memory in Linux / Ubuntu

Short Answer:
free -m | awk 'NR==3 {print $4 " MB"}'

The command 'free' displays some formatted information from /proc/meminfo.
The throw '-m' displays these numbers in rounded megabytes.

# free -m
         total      used     free   shared     buffers     cached
Mem:      4049      3982       67        0          16       3530
-/+ buffers/cache:   435     3614
Swap:     6142        53     6088

It's strange, cause I always figured the "first row, third column" - right under 'FREE' - would be the amount of free memory on a Linux system. But that number was always low after I'd been running awhile.

And it turns out that it is NOT really what I was looking for. A more accurate representation of the memory being used by your applications and available for new processes is displayed in the SECOND line.

In addition to the memory that is actually being USED by the kernel and processes resident in memory - Linux also reserves memory to allocate to processes as 'buffers' AND uses pretty much any left over memory to hold "cached" files.

Looking only at the top line...
total = all memory in the system (4GB on this server)
used = all memory currently in use/reserved by running processes and the OS
free = total - used
shared = memory being shared by multiple processes (deprecated?)
buffers = memory reserved by the OS to alloc as buffers when process need them (aka the 'heap')
cached = recently used files being stored in ram (THANK YOU LINUX!)

Here's a simple example I found to show off the power of 'caching':
for i in 1 2 ; do free -o; time grep -r foo /usr/bin >/dev/null 2>/dev/null; done
So really the buffers would be allocated to a running process if it asked for them anyway, and the memory being used to cache copies of recently used files would be released immediately if it makes sense to allocate the RAM elsewhere. So all that memory is 'available'.

Using these definitions:

When thinking about 'how much memory is really being used' - I want to calculate:
'used' - ('buffers' + 'cached')

When thinking about 'how much memory is really free' - I want to calculate:
'free' + ('buffers' + 'cached')

With this in mind, the meaning of the second row header form the output of the Linux command "free" (-/+ buffers/cache:) makes more sense...

Free is doing some light lifting for us, using the formula's above to display:
"minus buffers and cache" for the used column
"plus buffers and cache" for the free colum

So when you run free on Linux - the amount of free memory is always displayed right there in the second row, third column. Hence the 'Short Answer'...

- Much respect to Mike Griffin who got me thinking about this.


Anonymous said...

Thank you. Had trouble understanding the 'free' command

Anonymous said...

Percentage of used memory can be calculated as below:

Used memory-(buffers-cache)
------------------------------ x 100
Total Memory

Anonymous said...

Thanks for a great explanation. However, some of the links you included are now dead. If possible, could you please update them.


Anonymous said...

Thank you dude, i really needed this.
Renato Alves/Brazil

Anonymous said...

Thank you for info about free command.

Nits said...

Have doubts over the shared section , my system reads below output for free -m
total used free shared buffers cached
Mem: 11931 10190 1741 4034 324 8949
-/+ buffers/cache: 915 11015
Swap: 761 6 754

free -m | awk 'NR==3 {print $4 " MB"}'
11014 MB -- IS this correct or do we need to take shared into consideration ??
free -V
procps version 3.2.8

k santhosh said...

Really a very solid explanation. Thank you so much for taking your time and sharing your wisdom.

mghh said...

nice explanation, but i need to clear some doubts.
let's see a snippet:
total used free shared buffers cached
Mem: 7902 7418 483 959 759 2507
-/+ buffers/cache: 4151 3750
Swap: 0 0 0

i can't understand why 'buffers/cache' memory size is not same in 'used' and 'free' zone? Or why is that the size in first row specifying 'buffers' and 'cached' doesn't add up to any category in "-/+ buffers/cache"?

clayg said...

Well, there's some rounding at play. You can run the command "free" without the -m option and get the default of --kilo which should make the math a bit closer. But it's not far off.

The second line is "used - (buffers + cache)" (i.e. 7418 - (759 + 2507) = ~4151) followed by "free + buffers + cache" (i.e. 483 + 759 + 2507 = ~3750)

Even used + free (7418 + 483) is 7901 not 7902 but you know... it's close!

Prasanth said...