memory management
(Written by Paul Cobbaut, https://github.com/paulcobbaut/, with contributions by: Alex M. Schapelle, https://github.com/zero-pytagoras/)
This chapter will tell you how to manage RAM memory and cache.
We start with some simple tools to display information about memory:
free -om
, top
and
cat /proc/meminfo
.
We continue with managing swap space, using terms like
swapping
, paging
and
virtual memory
.
The last part is about using vmstat
to monitor swap usage.
displaying memory and cache
/proc/meminfo
Displaying /proc/meminfo
will tell you a lot about the
memory on your Linux computer.
student@linux:~$ cat /proc/meminfo
MemTotal: 3830176 kB
MemFree: 244060 kB
Buffers: 41020 kB
Cached: 2035292 kB
SwapCached: 9892 kB
...
The first line contains the total amount of physical RAM, the second
line is the unused RAM. Buffers
is RAM used for buffering files,
cached
is the amount of RAM used as cache and SwapCached
is the
amount of swap used as cache. The file gives us much more information
outside of the scope of this course.
free
The free
tool can display the information provided by
/proc/meminfo
in a more readable format. The example below displays
brief memory information in megabytes.
student@linux:~$ free -om
total used free shared buffers cached
Mem: 3740 3519 221 0 42 1994
Swap: 6234 82 6152
top
The top
tool is often used to look at processes
consuming most of the cpu, but it also displays memory information on
line four and five (which can be toggled by pressing m
).
Below a screenshot of top on the same ubu1010 from above.
top - 10:44:34 up 16 days, 9:56, 6 users, load average: 0.13, 0.09, 0.12
Tasks: 166 total, 1 running, 165 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.1%us, 4.6%sy, 0.6%ni, 88.7%id, 0.8%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 3830176k total, 3613720k used, 216456k free, 45452k buffers
Swap: 6384636k total, 84988k used, 6299648k free, 2050948k cached
managing swap space
about swap space
When the operating system needs more memory than physically present in
RAM, it can use swap space
. Swap space is located on
slower but cheaper memory. Notice that, although hard disks are commonly
used for swap space, their access times are one hundred thousand times
slower.
The swap space can be a file, a partition, or a combination of files and
partitions. You can see the swap space with the free
command, or with
cat /proc/swaps
.
student@linux:~$ free -o | grep -v Mem
total used free shared buffers cached
Swap: 6384636 84988 6299648
student@linux:~$ cat /proc/swaps
Filename Type Size Used Priority
/dev/sda3 partition 6384636 84988 -1
The amount of swap space that you need depends heavily on the services that the computer provides.
creating a swap partition
You can activate or deactivate swap space with the
swapon
and swapoff
commands. New swap
space can be created with the mkswap
command. The
screenshot below shows the creation and activation of a swap partition.
root@linux:~# fdisk -l 2> /dev/null | grep hda
Disk /dev/hda: 536 MB, 536870912 bytes
/dev/hda1 1 1040 524128+ 83 Linux
root@linux:~# mkswap /dev/hda1
Setting up swapspace version 1, size = 536702 kB
root@linux:~# swapon /dev/hda1
Now you can see that /proc/swaps
displays all swap spaces separately,
whereas the free -om
command only makes a human readable summary.
root@linux:~# cat /proc/swaps
Filename Type Size Used Priority
/dev/mapper/VolGroup00-LogVol01 partition 1048568 0 -1
/dev/hda1 partition 524120 0 -2
root@linux:~# free -om
total used free shared buffers cached
Mem: 249 245 4 0 125 54
Swap: 1535 0 1535
creating a swap file
Here is one more example showing you how to create a swap file
. On
Solaris you can use mkfile
instead of
dd
.
root@linux:~# dd if=/dev/zero of=/smallswapfile bs=1024 count=4096
4096+0 records in
4096+0 records out
root@linux:~# mkswap /smallswapfile
Setting up swapspace version 1, size = 4190 kB
root@linux:~# swapon /smallswapfile
root@linux:~# cat /proc/swaps
Filename Type Size Used Priority
/dev/mapper/VolGroup00-LogVol01 partition 1048568 0 -1
/dev/hda1 partition 524120 0 -2
/smallswapfile file 4088 0 -3
swap space in /etc/fstab
If you like these swaps to be permanent, then don\'t forget to add them
to /etc/fstab
. The lines in /etc/fstab will be similar
to the following.
/dev/hda1 swap swap defaults 0 0
/smallswapfile swap swap defaults 0 0
monitoring memory with vmstat
You can find information about swap usage
using
vmstat
.
Below a simple vmstat
displaying information in megabytes.
student@linux:~$ vmstat -S m
procs ---------memory-------- ---swap-- -----io---- -system- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 87 225 46 2097 0 0 2 5 14 8 6 5 89 1
Below a sample vmstat
when (in another terminal) root launches a
find /
. It generates a lot of disk i/o (bi and bo are disk blocks in
and out). There is no need for swapping here.
student@linux:~$ vmstat 2 100
procs ----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 84984 1999436 53416 269536 0 0 2 5 2 10 6 5 89 1
0 0 84984 1999428 53416 269564 0 0 0 0 1713 2748 4 4 92 0
0 0 84984 1999552 53416 269564 0 0 0 0 1672 1838 4 6 90 0
0 0 84984 1999552 53424 269560 0 0 0 14 1587 2526 5 7 87 2
0 0 84984 1999180 53424 269580 0 0 0 100 1748 2193 4 6 91 0
1 0 84984 1997800 54508 269760 0 0 610 0 1836 3890 17 10 68 4
1 0 84984 1994620 55040 269748 0 0 250 168 1724 4365 19 17 56 9
0 1 84984 1978508 55292 269704 0 0 126 0 1957 2897 19 18 58 4
0 0 84984 1974608 58964 269784 0 0 1826 478 2605 4355 7 7 44 41
0 2 84984 1971260 62268 269728 0 0 1634 756 2257 3865 7 7 47 39
Below a sample vmstat
when executing (on RHEL6) a simple memory
leaking program. Now you see a lot of memory being swapped (si is
\'swapped in\').
[student@linux ~]$ vmstat 2 100
procs ----------memory-------- ---swap-- ----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 3 245208 5280 232 1916 261 0 0 42 27 21 0 1 98 1 0
0 2 263372 4800 72 908 143840 128 0 1138 462 191 2 10 0 88 0
1 3 350672 4792 56 992 169280 256 0 1092 360 142 1 13 0 86 0
1 4 449584 4788 56 1024 95880 64 0 606 471 191 2 13 0 85 0
0 4 471968 4828 56 1140 44832 80 0 390 235 90 2 12 0 87 0
3 5 505960 4764 56 1136 68008 16 0 538 286 109 1 12 0 87 0
The code below was used to simulate a memory leak (and force swapping). This code was found on wikipedia without author.
student@linux:~$ cat memleak.c
#include <stdlib.h>
int main(void)
{
while (malloc(50));
return 0;
}
practice : memory
1. Use dmesg
to find the total amount of memory in your computer.
2. Use free
to display memory usage in kilobytes (then in megabytes).
3. On a virtual machine, create a swap partition (you might need an extra virtual disk for this).
4. Add a 20 megabyte swap file to the system.
5. Put all swap spaces in /etc/fstab
and activate them. Test with a
reboot that they are mounted.
6. Use free
to verify usage of current swap.
7. (optional) Display the usage of swap with vmstat
and free -s
during a memory leak.
solution : memory
1. Use dmesg
to find the total amount of memory in your computer.
dmesg | grep Memory
2. Use free
to display memory usage in kilobytes (then in megabytes).
free ; free -m
3. On a virtual machine, create a swap partition (you might need an extra virtual disk for this).
mkswap /dev/sdd1 ; swapon /dev/sdd1
4. Add a 20 megabyte swap file to the system.
dd if=/dev/zero of=/swapfile20mb bs=1024 count=20000
mkswap /swapfile20mb
swapon /swapfile20mb
5. Put all swap spaces in /etc/fstab
and activate them. Test with a
reboot that they are mounted.
root@computer# tail -2 /etc/fstab
/dev/sdd1 swap swap defaults 0 0
/swapfile20mb swap swap defaults 0 0
6. Use free
to verify usage of current swap.
free -om
7. (optional) Display the usage of swap with vmstat
and free -s
during a memory leak.