Resizing swap
I use small Digital Ocean virtual machines, and they come with little RAM and little drive space. I originally allocated 4 GB for the swap, but now I want to reduce it to 2 GB.
Initially to prevent the server from going out of RAM and randomly killing processes like it happened in Fixing `Error: Authentication failed.` on a previously perfectly running MongoDB server, I had set up a 4 GB swapfile.
But now I have the opposite problem. I run out of drive space too easily. Considering the fact that the server uses on average only 500 MB out of 1 GB, I am unlikely to need 4 GB of swapfile. 2 GB should be sufficiently.
Setting up the swap
Here's how I originally set up swap, based on https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04. Note that they should be run as root (or use sudo
):
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Then in /etc/fstab (nano /etc/fstab
), add the following line:
/swapfile none swap sw 0 0
Downsizing the swap
TLDR
swapoff /swapfile
rm /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
How I got there
Here's what I found on StackOverflow:
swapoff /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
However, when I ran the first command, I got this:
# swapoff /swapfile
Killed
Does it mean it successfully killed the swapfile, ie closed the swap? Nope.
# fallocate -l 2G /swapfile
fallocate: fallocate failed: Text file busy
This error means that the swapfile is still being used. You can verify it like so:
# swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 4G 41.5M -2
So it turned out that Killed
meant that since the drive was full, there was not enough space to execute swapoff
and the process was Killed. After freeing up some space, I ran swapoff
again and this time it worked.
However when running mkswap
, I got this:
# mkswap /swapfile
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=b2a6f46e-7731-40f7-83a5-7893ad12d147
So it turned out that even if I had used fallocate to tell it to allocate 2GB, the command didn't actually reduce the size of the file. So it looks like before allocating that file, I should remove the old file.
After I completed all the steps, I verified that all was well by running top
:
top - 00:02:21 up XXX days, 23:39, 1 user, load average: 0.02, 0.07, 0.07
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
MiB Mem : 478.1 total, 8.9 free, 375.6 used, 93.6 buff/cache
MiB Swap: 2048.0 total, 2046.0 free, 2.0 used. 76.2 avail Mem
MiB Swap: 2048 MB. Good!