Linux Memory and Processes

Use free to determine how much memory is being used, and how much is available.

Display memory usage in MB:

free -m

Sample output:

             total       used       free     shared    buffers     cached
Mem:          3952       3849        103          0       1917        574
-/+ buffers/cache:       1357       2595
Swap:          517        256        261

The total memory available to the OS is the total column in the Mem row: 3952 MB.

The top row used (3849) value will almost always nearly match the top row mem value (3952). Since Linux likes to use any spare memory to cache disk blocks (574).

The actual memory being used is in the -/+ buffers/cache row. The used value (1357) plus the free value (2595) will equal the total memory available to the OS (3952).

Determining swap usage is the same as before. The total swap available to the OS is in the total value (517), 256 MB is being used and 261 MB are still available.

Finding how much memory a process is using

This is especially helpful for tuning system daemons that can modify their memory usage, such as MySQL and Apache. We'll need to use ps as well as a few pipes to find the amounts we are looking for.

First, display just the processes for one program, and sort them by memory usage (rss) in order from lowest to highest thread. In this case, we'll use httpd:

ps a -ylC httpd --sort rss

Next, we only need the RSS column:

ps a -ylC httpd --sort rss | awk '{print $8'}

This still displays the memory usage for all the processes, and in the case of Apache, all the threads. We want to determine the maximum memory used out of all of them, so just return the last line:

ps a -ylC httpd --sort rss | awk '{print $8'} | tail -n 1

An example output would be 22596. You can verify this number by running htop, displaying only the processes for user apache, and sorting by resident memory:

htop -u apache --sort-key M_RESIDENT

Or, you can use top, though it is not sorted. Look at the RES column:

top -u apache -n 1

Divide that number by 1024 to determine the amount of memory used in MB.

echo 22596/1024 | bc

So, the thread using the most memory is taking 22 MB.