Checking Out-of-Memory Errors and Creating a Swap File on Your Server

Check for Linux out-of-memory events and configure a persistent swap file on a server, with the original terminal screenshots.

Linux · Ubuntu · Memory

Updated:

Originally published on Medium

All of us know that Ghost runs on Node.js. When we choose a 1 GB VPS from Digitalocean, the VPS will get stuck because of its RAM usage. But here is the solution:

We have to create a swap partition on the server.

What is a swap?

Swap space is the area of a hard disk. It is a part of your machine’s virtual memory, which is a combination of accessible physical memory (RAM) and the swap space. Swap holds memory pages that are temporarily inactive. Swap space is used when your operating system needs physical memory for active processes but there isn’t enough physical memory available (that is, not being used). When this happens, inactive pages from the physical memory are then moved into the swap space, freeing up that physical memory for other uses. Note that the access time for a swap is slower, depending on the speed of the hard drive. It is not a complete replacement for physical memory. Swap space can be a dedicated swap partition, a swap file, or a combination of swap partitions and swap file(s).

Let’s create the swap.

Step 1: Swap Information Check-up

The size of swap space depends on the system’s RAM. So, it’s important to make sure your system has enough swap space before making one. Type the below command to check if the system has any swap configured:

$ sudo swapon --show
Terminal showing no active swap devices

An output displayed means there is space available in your system to create swap space. However, no output is a signal indicating there is not enough available space to add swap space.

Use the free utility to verify that there is no active swap:

$ free -h

You’ll see the output as a null swap row:

Output of free -h before enabling swap

Step 2: Hard Drive Partition Availability Check-up

Similar to checking the system availability, now let’s check our current disk usage to ensure that we have enough space. Use the df command to check the hard disk partition availability:

df -h

The device with / in the Mounted on column is our disk which is 11% use. You’ll see the output:

Disk usage and available space in df -h

After checking the system’s requirements, let’s move forward and create a swap file on our filesystem.

Step 3: Create a Swap File

To create a swap file on our filesystem, allocate a file name as a swapfile in the root (/) directory using the fallocate program. Allocating a file size depends on your needs. To keep the tutorial simple, and easy to understand, we’re allocating 1 GiB of disk space. Check that /swapfile does not already exist before creating it. Use the sudo command to create a swap file:

sudo fallocate -l 1G /swapfile

Next, type this command to verify the reserved space:

ls -lh /swapfile

You’ll see the output:

Terminal showing the newly allocated one-gibibyte swap file

Now that we have created a swap space in our system, let’s enable it in the next step.

Step 4: Enable the Swap File

Once we have the correct size available, let’s convert it into swap space. For security reasons, it is crucial to make our file accessible to root users and prevent accessibility from normal users. We’ll add restrictions so that users with root privileges can view the file and read its contents. Use the following root command to make the file only accessible to root users:

sudo chmod 600 /swapfile

Then, use the ls command to verify the changes:

ls -lh /swapfile

As you can see, only the root user has the read and write flags enabled:

The swap file has read and write permissions for its owner only

After that, mark the file as swap space:

sudo mkswap /swapfile

You’ll see the output:

mkswap reports a one-gibibyte swap area

After that, enable the swap file and permit our system to start using it:

sudo swapon /swapfile

Next, verify the swap availability:

$ sudo swapon --show

You’ll see the output:

swapon lists the active swap file

As we did in Step 1, we’ll check the free utility space once again:

free -h

You’ll see the output:

free -h reports available swap space

Our swap has been set up successfully and our operating system will begin to use it as necessary. In the next step, we will make the swap file permanent.

Step 5: Make the Swap File Permanent

By default, the server will not retain the swap settings automatically whenever we reboot. To change the default settings and play on the safe side, we will add the swap file to our /etc/fstab file. Use the sudo command to back up the /etc/fstab file:

sudo cp /etc/fstab /etc/fstab.bak

Check that /etc/fstab has no entry for /swapfile already, then add it:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

After that, let’s review some settings and make modifications so that we can tune our swap space.

Step 6: Swap Settings Modification

In this step, we’ll configure the settings and make some modifications. Let’s adjust the swappiness property and change cache pressure.

  • Adjust the Swappiness Property

vm.swappiness describes the relative cost the kernel assigns to reclaiming memory through swap versus dropping filesystem cache. On current Linux kernels the range is 0 to 200. A value of 15 makes the kernel less inclined to swap under most conditions. Keep the default unless measurements give you a reason to tune it.

Check the current swappiness value by typing:

cat /proc/sys/vm/swappiness

You’ll see the output:

The server’s initial swappiness value

You can also set the swappiness of your choice using the sysctl command. Let’s set the swappiness value to 15 by typing:

sudo sysctl -w vm.swappiness=15

You’ll see the output:

sysctl reports a swappiness value of 15

Until the system is rebooted, the settings will remain as is. Add the line to our /etc/sysctl.conf file to set the value automatic at restart/reboot:

sudo nano /etc/sysctl.conf

You can add the following code at the bottom:

vm.swappiness=15
The persistent vm.swappiness setting in the sysctl configuration

Then, save and close the file.

  • Adjust the Cache Pressure

Next, we are going to modify vfs_cache_pressure that will take care of inode and dentry information over other data. These vfs_cache_pressure 1 settings 1 also control the tendency of the kernel to reclaim the memory used for caching of the directory. Navigate the proc filesystem again to check the current value:

cat /proc/sys/vm/vfs_cache_pressure

You’ll see the output:

The server’s initial vfs_cache_pressure value

As the configuration is already done, our system will eliminate the inode information from the cache. Let’s set the sysctl vm.vfs_cache_pressure to an example value like this:

sudo sysctl -w vm.vfs_cache_pressure=60

You’ll see the output:

sysctl reports the new cache pressure value

Similar to what we did in our swappiness setting, we can change the configuration here as well:

sudo nano /etc/sysctl.conf

At the bottom, insert a line indicating the new value you created:

vm.vfs_cache_pressure=60
The persistent vm.vfs_cache_pressure setting in the sysctl configuration

Finally, save and close the file.

Conclusion

You can add swap space as a dedicated swap partition, a swap file, or a combination of both. You can create swap space and leverage its benefits to run applications seamlessly without much worrying about out-of-memory warnings. While creating swap space is an added advantage in systems with limited memory space, it must not be treated as an alternative for more RAM space. Remember, swap space is located on a hard disk therefore you may experience a slightly slow access time compared to physical memory.

References

  1. Ubuntu swap guidance
  2. Linux vm.swappiness documentation

Written by:

Full Stack Developer working with TypeScript, React and Node.js. Web development since 2019, across product interfaces, APIs and analytics.

A bit about me