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
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
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 - 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!