Why does 'top' indicate low memory usage, whilst 'free' indicates high memory usage?
Why does 'top' indicate low memory usage, whilst 'free' indicates high memory usage?
Mem: 262144k total, 225708k used, 36436k free, 47948k buffers
Swap: 262136k total, 40k used, 262096k free, 110704k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1652 root 15 0 79456 14m 1728 S 0.0 5.6 0:00.02 miniserv.pl
3544 root 15 0 87920 3356 2584 R 0.0 1.3 0:00.01 sshd
3707 root 16 0 86704 3104 2416 S 0.0 1.2 0:00.00 sshd
3708 sshd 15 0 61864 1452 872 S 0.0 0.6 0:00.00 sshd
3548 root 16 0 10872 1432 1116 S 0.0 0.5 0:00.00 bash
1908 root 15 0 10876 1392 1072 S 0.0 0.5 0:00.00 sh
918 root 15 0 60520 1204 664 S 0.0 0.5 0:00.07 sshd
3624 root 15 0 12584 1180 920 R 0.0 0.5 0:00.00 top
926 root 18 0 19672 1152 576 S 0.0 0.4 0:00.00 crond
1 root 15 0 10324 704 588 S 0.0 0.3 0:00.02 init
311 root 16 -4 12580 704 388 S 0.0 0.3 0:00.06 udevd
874 root 16 0 5884 592 472 S 0.0 0.2 0:00.06 syslogd
877 root 18 0 3780 420 336 S 0.0 0.2 0:00.00 klogd
Total MEM usage = 12.1%
However, 226mb used out of 262mb, with 36mb free - i.e. 86.25% used.
Even taking in to account the swap, total memory 262mb*2 = 524mb. Given 226mb is used, 43.12% is used. Both are much higher than the actual processed listed by top.
The server is a fresh 256MB VPS running CentOS 5.2 - haven't installed anything on it yet. Running webadmin; i.e. no Plesk.
This question is fundamentally about the conflicting information that seems to be given by top; but I am also wondering if this memory usage is normal, for a server that isn't running any particularly memory intensive applications. I intend to install Apache/Ruby EE/Passenger; however if memory usage is already this high, I'm unsure how well it is going to handle it.
Solution 1:
Top, that is the figure in the %MEM
column, is counting the amount of RSS
memory (Resident Segment Size, basically pages physically in memory that have real data on them) as a percentage of total physical memory in your machine or VPS.
On the other hand, free is counting just that, the amount of physical memory pages that have no data on them, and have not been assigned to buffers, cache or the kernel. In a Unix like operating system, the OS tries hard to keep that number as low as possible by using free pages for disk cache. The only time you'll likely a high value of free memory is just after your machine boots, or if you quit a program that was consuming a large amount of physical memory itself.
Is this memory usage normal ? The short answer is yes. It is typical for Unix programs to allocate (that is ask the OS for) significantly more memory than they would use. If you look at the VSS
column, for the processes listed the total is over 463mb. That is because
- A lot of the memory accounted against each process will be physically mapped to the same library, say
glibc
- The OS generally overcommits memory to the application, on the basis that most applications never come to collect on what they have asked for.
Figure out process memory usage is more an art than a science IMHO, see the discussions on http://lwn.net. My advice is to keep a close eye on iostat -xm
and ensure that your machine is not swapping heavily.
Solution 2:
In addition to Dave Cheney's answer:
Total memory use minus buffers and cache (159M) is ~67M and 67/524M ~12%. As more memory is needed by running processes the system will automatically clear out old cache and allocate that.
If you run free, You'll get an idea of how much memory is actually in use by running processes and what is actually available.
$ free -m
total used free shared buffers cached
Mem: 247 218 29 0 46 96
-/+ buffers/cache: 74 172
Swap: 556 0 556
The line you're interested in is the -/+ buffers/cache