How To Boost Linux Server Performance By Enabling Swap
It worked so well that I wanted to write down my findings and explain to everyone how to do it in a (hopefully) well-documented way.
Introduction
A very practical strategy for preemptively avoiding getting out-of-memory errors within all kinds of applications is increasing the Swap space on your Linux server. By allocating Swap space you will effectively create a special area for the operating system to unload applications from the RAM to prevent memory exhaustion.
In this article, we will learn how to create a Linux Swap to boost our server performance. With detailed instructions and practical examples, you will understand the implementation process and be ready to optimize your server.
If you want to skip everything and just try out my recommendations, please jump to the section "Script To Do Everything Automatically".
But wait, What is Swap?
On a Linux system, Swap is a special area on your HDD that is designed to temporarily store RAM data to increase the "memory" with some limitations. Because the Swap file is on the HDD it will be significantly slower than your RAM. Therefore, it will only be used as the RAM gets full, to keep data from running applications in "memory" instead of throwing it away. So this Swap file is a good utility file to use if your RAM runs full and some kind of safety approach against out-of-memory exceptions on low RAM systems.
To learn more about the concept and get more insights about the process of "swapping" you should read this Wikipedia page where "Memory Paging" is explained in detail:
After reading (or skipping) the Wikipedia page you can now follow this guide by applying all explained commands.
Check If Swap Is Already Enabled
The first step we have to do is check if our server already has a Swap file registered.
To list all configured Swap files we have to type:
swapon --show
This command does not produce any output if the system does not have any Swap file available. Additionally, we can use the free
utility on Linux to display information about the RAM which will also display information about the Swap file:
~# free -h
total used free shared buff/cache available
Mem: 7.6Gi 6.1Gi 170Mi 137Mi 1.3Gi 1.1Gi
Swap: 0B 0B 0B
In this snippet, we see that our server has a total of 8G of RAM and no Swap file configured.
Create a Swap File
Assuming we have enough free HDD space left, we can now create a new Swap file within our Linux filesystem. To do this we will create a file named swap
in our root (/
) directory with a utility tool called fallocate
(should be installed on every Linux machine).
fallocate
just creates a file with the specified size.As our server has 8G of RAM we should create a Swapfile which is at least the same size. If you have another amount of RAM please adjust the following command to your needs:
fallocate -l 8G /swap
Enable the Swap File
Before we turn the allocated space into a Swap file, we should lock down the permissions to avoid users accessing it except them with root privileges. If not doing this all users on the server can access the file and read its content. This would be a major security issue and have to be avoided at all costs.
To make the file only accessible by root we use chmod
:
chmod 600 /swap
Now to check if the file exists and has the correct permission use:
~# ls -lh /swap
-rw------- 1 root root 8.0G Feb 15 20:40 /swap
If your output looks the same you can mark the Swap file as your Swap space by executing:
mkswap /swap
The command should output the following:
~# mkswap /swap
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=baf2b4a0-9ddd-4fb6-a941-289e85ff9dc4
The last step is enabling the Swap file by executing:
swapon /swap
After we executed all previously shown commands we can use free
and swapon
to validate if the Swap file no is present on the Linux server:
swapon
~# swapon --show
NAME TYPE SIZE USED PRIO
/swap file 8G 0B -2
free
~# free -h
total used free shared buff/cache available
Mem: 7.6Gi 6.1Gi 162Mi 137Mi 1.3Gi 1.1Gi
Swap: 8.0Gi 0B 8.0Gi
Permanently Enable Swap File
Unfortunately, everything done in the previous chapters will be gone after we reboot our server. Luckily, we can change this by adding the swap file in the fstab
file. This can be done in two ways:
1. Use Echo and Tee:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
2. Manually adding /swapfile none swap sw 0 0
at the end of the /etc/fstab
file with your preferred Editor
Further Improvements
When using a Swap file there are two settings that I personally think are important to adjust. First, there is vfs_cache_pressure
which controls the tendency of the kernel to reclaim the memory which is used for caching of inode and directory objects. The second setting is the swappiness
which controls how much the kernel prefers Swap over Ram. Both settings should be adjusted to optimize Swap file usage on our server. For more settings just read the Linux kernel documentation
Adjust vfs_cache_pressure
Before we change the value of vfs_cache_pressure
we should check the current value by executing:
cat /proc/sys/vm/vfs_cache_pressure
On my server running Linux, the initial value was set to 100
which is really high and will remove inode information too quickly. Because of this, we should set the value to 50 by using the sysctl
command:
sysctl vm.vfs_cache_pressure=50
As with the Swap file, this setting is only valid until we reboot our server. To persist the vfs_cache_pressure
setting in our server we have to adjust the sysctl.conf
within the etc
folder.
Open /etc/sysctl.conf
with your preferred Editor (I use VIM) and add the following line at the bottom:
vm.vfs_cache_pressure=50
Adjust swappiness
As with the vfs_cache_pressure
the first command we execute is used to check the current value of the Swappiness:
cat /proc/sys/vm/swappiness
On my server, this setting was 60 which is a good default setting for a desktop computer which will often use a GUI and other different programs. But, when used as a server the Swappiness should be much lower to boost Swap and Ram performance. You can play around with the settings but I recommend something between 10 - 20.
As done before we have to use sysctl
to set the Swappiness on our server:
sysctl vm.swappiness=20
To persist the setting in our server we have to use our preferred Editor and open the /etc/sysctl.conf
and add the following line at the bottom:
vm.swappiness=20
Script To Do Everything Automatically
If you trust me (obviously you do) and just want to enable Swap file, set the Swappiness, and adjust the Cache Pressure you can simply copy the following script:
fallocate -l 8G /swap
chmod 600 /swap
mkswap /swap
swapon /swap
echo '/swap none swap sw 0 0' | tee -a /etc/fstab
echo 'vm.swappiness=20' | tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf
Then adjust your Swap file size (remember it should align with your RAM) and paste it into your CLI connected to your server.
Closing Notes
Managing the Swap space on Linux servers is important for preventing memory errors and boosting performance. If you followed this guide, you should now have set up and optimized your Swap space which normally should boost your server.
Hopefully, this article was easy to understand and your server is faster than ever and will not get any out-of-memory errors or reboots (like mine before I did it).
Do you have any questions regarding Swap? I would love to hear your feedback, your thoughts and answer all your questions. Please share everything in the comments.
Feel free to connect with me on Medium, LinkedIn, Twitter, and GitHub.