What is Virtual Memory?
Linux supports virtual memory, that is, using a disk as an extension of RAM so that the effective size of usable memory grows correspondingly. The kernel will write the contents of a currently unused block of memory to the hard disk so that the memory can be used for another purpose. When the original contents are needed again, they are read back into memory. This is all made completely transparent to the user; programs running under Linux only see the larger amount of memory available and don't notice that parts of them reside on the disk from time to time. Of course, reading and writing the hard disk is slower (on the order of a thousand times slower) than using real memory, so the programs don't run as fast. The part of the hard disk that is used as virtual memory is called the swap space.
Linux can use either a normal file in the filesystem or a separate partition for swap space. A swap partition is faster, but it is easier to change the size of a swap file (there's no need to repartition the whole hard disk, and possibly install everything from scratch). When you know how much swap space you need, you should go for a swap partition, but if you are uncertain, you can use a swap file first, use the system for a while so that you can get a feel for how much swap you need, and then make a swap partition when you're confident about its size.
You should also know that Linux allows one to use several swap partitions and/or swap files at the same time. This means that if you only occasionally need an unusual amount of swap space, you can set up an extra swap file at such times, instead of keeping the whole amount allocated all the time.
A note on operating system terminology: computer science usually distinguishes between swapping (writing the whole process out to swap space) and paging (writing only fixed size parts, usually a few kilobytes, at a time). Paging is usually more efficient, and that's what Linux does, but traditional Linux terminology talks about swapping anyway.
Creating a swap space
The bit about holes is important. The swap file reserves the disk space so that the kernel can quickly swap out a page without having to go through all the things that are necessary when allocating a disk sector to a file.
The kernel merely uses any sectors that have already been allocated
to the file. Because a hole in a file means that there are no disk
sectors allocated (for that place in the file), it is not good for the
kernel to try to use them.
One good way to create the swap file without holes is through the following command:
$ dd if=/dev/zero of=/extra−swap bs=1024
count=1024 1024+0 records in
1024+0 records out $
where /extra−swap is the name of the swap file and the size of is
given after the count=. It is best for the size to be a multiple of 4,
because the kernel writes out memory pages, which are 4 kilobytes in
size. If the size is not a multiple of 4, the last couple of kilobytes
may be unused.
A swap partition is also not special in any way. You create it just
like any other partition; the only difference is that it is used as a
raw partition, that is, it will not contain any filesystem at all. It is
a good idea to mark swap partitions as type 82 (Linux swap); this will
the make partition listings clearer, even though it is not strictly
necessary to the kernel.
After you have created a swap file or a swap partition, you need to
write a signature to its beginning; this contains some administrative
information and is used by the kernel. The command to do this is mkswap,
used like this:
$ mkswap /extra−swap 1024
Setting up swapspace, size = 1044480
bytes
$
Note that the swap space is still not in use yet: it exists, but the kernel does not use it to provide virtual memory.
You
should be very careful when using mkswap, since it does not check that
the file or partition isn't used for anything else. You can easily
overwrite important files and partitions with mkswap! Fortunately, you
should only need to use mkswap when you install your system.
The
Linux memory manager limits the size of each swap space to 2 GB. You
can, however, use up to 8 swap spaces simultaneously, for a total of
16GB.
Using a swap space:
An initialized swap space is taken into use with swapon. This command
tells the kernel that the swap space can be used. The path to the swap
space is given as the argument, so to start swapping on a temporary swap
file one might use the following command.
$ swapon /extra−swap
$
Swap spaces can be used automatically by listing them in the /etc/fstab file.
/dev/hda8 none swap sw 0 0
/swapfile none swap sw 0 0
The
startup scripts will run the command swapon −a, which will start
swapping on all the swap spaces listed in /etc/fstab. Therefore, the
swapon command is usually used only when extra swap is needed.
You can monitor the use of swap spaces with free. It will tell the total amount of swap space used.
$ free
total used free shared
buffers
Mem: 15152 14896 256 12404 2528
−/+ buffers: 12368 2784
Swap: 32452 6684 25768
$
The
first line of output (Mem:) shows the physical memory. The total column
does not show the physical memory used by the kernel, which is usually
about a megabyte. The used column shows the amount of memory used (the
second line does not count buffers). The free column shows completely
unused memory. The shared column shows the amount of memory shared by
several processes; the more, the merrier. The buffers column shows the
current size of the disk buffer cache.
That
last line (Swap:) shows similar information for the swap spaces. If
this line is all zeroes, your swap space is not activated.
The
same information is available via top, or using the proc filesystem in
file /proc/meminfo. It is currently difficult to get information on the
use of a specific swap space.
A swap space can be removed from use with swapoff. It is usually not
necessary to do it, except for temporary swap spaces. Any pages in use
in the swap space are swapped in first; if there is not sufficient
physical memory to hold them, they will then be swapped out (to some
other swap space). If there is not enough virtual memory to hold all of
the pages Linux will start to thrash; after a long while it should
recover, but meanwhile the system is unusable. You should check (e.g.,
with free) that there is enough free memory before removing a swap space
from use.
All the swap spaces that are used automatically with swapon −a can be
removed from use with swapoff −a; it looks at the file /etc/fstab to
find what to remove. Any manually used swap spaces will remain in use.
Sometimes a lot of swap space can be in use even though there is a lot
of free physical memory. This can happen for instance if at one point
there is need to swap, but later a big process that occupied much of the
physical memory terminates and frees the memory. The swapped−out data
is not automatically swapped in until it is needed, so the physical
memory may remain free for a long time. There is no need to worry about
this, but it can be comforting to know what is happening.
No comments:
Post a Comment