AWS EC2 instances do not come preconfigured with a swapfile. This means that if your application runs out of free memory something’s probably gonna crash.
NOTE: You will need sudo access to do this!
This creates the swapfile in ephemeral storage. This is ideal for a number of reasons, but comes with one major caveat: While you can RESTART the instance with impunity, if you STOP the instance the ephemeral storage is lost. This means that if you need to STOP the instance for any reason, you must manually recreate the swapfile when you START it again.
You COULD put the swapfile on one of the EBS partitions, but that has two main problems. First, EBS is network-attached storage and as such is (relatively) slow. Not ideal for swap. Secondly, EBS partitions are billed (partially) based on iops, so if you have an application that’s going to hit swap a LOT, you could easily incur non-trivial iops charges.
Determine if your instance already has a swapfile
sudo swapon -s
Filename
Type
Size
Used
Priority
If you get actual output then you already have a swapfile:
Filename
Type
Size
Used
Priority
/mnt/swapfile
file
8388604
0
-1
You can also run top to check the size and availability of your swap:
top - 15:58:14 up 123 days, 10:13, 2 users, load average: 0.01, 0.13, 0.21
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.0%us, 2.3%sy, 0.0%ni, 92.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3840468k total, 3684892k used, 155576k free, 71016k buffers
Swap: 8388604k total, 0k used, 8388604k free, 1885980k cached
...
The important bit is that last line. If you have no swap configured it will show up like:
Swap: 0k total, 0k used, 0k free, 1885980k cached
Create a swapfile
Having determined your lack of swapfile, do the following to create one.
Determine the size of swapfile you should (theoretically) need
Conventional wisdom would say to use (physical_memory * 2) but as long as you make is several GB you should be good.
Shove the swapfile into the ephemeral storage partition
You want to do this on AWS instances.
Make sure your instance has the ephemeral store mounted
(It should be by default.)
df -h
Filesystem
Size
Used
Avail
Use%
Mounted on
/dev/xvda1
60G
5.7G
51G
11%
/
udev
1.9G
12K
1.9G
1%
/dev
tmpfs
751M 184K 750M 1% /run
none
5.0M 0 5.0M 0% /run/lock
none
1.9G 0 1.9G 0% /run/shm
/dev/xvdb 394G 8.3G 366G 3% /mnt
As long as you see a several hundred GB volume mounted to /mnt, you should be good to go. If you don’t see it, try:
sudo mount /dev/xvda2 /mnt
Make the actual swapfile
sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=4096
This will create a ~4GB swapfile in the root of the /mnt directory. The “if=/dev/zero” bit prefills the swapfile with zeros to preallocate the space. If you need more or less swap-space, set count to (number_of_gb * 1024).
Assign the swapfile and enable it
sudo chown root:root /mnt/swapfile
sudo chmod 600 /mnt/swapfile
sudo mkswap /mnt/swapfile
sudo swapon /mnt/swapfile
Add the swapfile to fstab
BE SUPER REALLY CAREFUL WITH THIS. If you screw up your fstab, you could brick the instance.
sudo vim /etc/fstab
#add the following line to the end of the fstab:
/mnt/swapfile swap swap defaults 0 0
#should end up looking something like:
LABEL=cloudimg-rootfs / ext4 defaults 0 0
/dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
/mnt/swapfile swap swap defaults 0 0
Turn the swapfile on
sudo swapon -a
Double check that the swapfile is being used
sudo swapon -s
Filename
Type
Size
Used
Priority
/mnt/swapfile file 8388604 0 -1
top
top - 16:30:53 up 123 days, 10:45, 2 users, load average: 0.00, 0.02, 0.11
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3840468k total, 3694308k used, 146160k free, 72632k buffers
Swap: 8388604k total, 0k used, 8388604k free, 1887192k cached
...
Congratulations!
You’ve set up and installed a swapfile on your EC2 instance and set it to be autoloaded on server restart.