Keep /tmp in RAM

This tutorial will show you how to turn your /tmp directory into a "RAM disk". Essentially this means that any file stored in /tmp is actually being stored in memory rather than on your persistent storage devices.

Before starting, it is worth explaining that:

  • Accessing content from RAM is much faster than the fastest SSDs in terms of both latency and throughput/bandwidth.
  • Data held in memory is lost whenever it loses power. This is why it is often referred to as volatile storage.
  • The /tmp is a temporary directory for content that will be removed at the next reboot. Hence it doesn't matter if it is suddenly lost due to a sudden unexpected loss of power as would happen with anything stored in RAM.

Steps

Decide How Much Ram To Use

Start a typical "heavy" workload. E.g. open 100 chrome tabs, play some music in the background, and open up a game. Now find out how much memory is free by using the command free -m. My output is as shows:

             total       used       free     shared    buffers     cached
Mem:         15707      13458       2249       4833        701       8453  
-/+ buffers/cache:       4303      11403
Swap:         3905          0       3905  

The figures are listed in MB. In this case we have 11,403 MB of RAM that is available to play with which is around 10.5 GiB. This looks a lot larger than the figure of 2249 but that is because my machine is currently using a lot of the "spare" ram for buffers/caching and not for processes.

We now know how much RAM we typically have lying around being "unused". You can decide based on this number what the cap should be on your RAM disk. You may want to use a figure between 75% and 100% of this figure. Obviously the more RAM you have the less likely you are to ever hit this cap. Running out of RAM will cause your computer to use swap which will seriously degrade performance so it is important to keep enough space spare for your processes, and also to not fill your /tmp area. Only you can find the sweet-spot, which is made less difficult by having lots of RAM. 4 X 8GB will only set you back £130.

I have decided to set the cap at 10240M (10GB). This is because I feel that I am very unlikely to hit this cap and this doesn't result 10GB of RAM being used unless I fill /tmp (not pre-allocated).

Update Fstab

Simply add the following line to /etc/fstab and substitute [CAP] with how many MB you wish to set your memory limit at. You may want to add a comment above to explain what it's there for.

tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,mode=1777,size=[CAP]M 0 0  

Now reboot. You could run sudo mount -a for the changes to take immediate effect, but this could cause issues as items currently being used in /tmp would "disappear".

Benchmarking

If you want to see how much difference this will make, run the following script from inside /tmp and also from inside a normal folder.

echo "writing 1GB sequentially"
dd if=/dev/zero of=1GB.img bs=1M count=1000 oflag=dsync

You should see a massive difference in performance, even if you use an SSD. This is because the script will write 1GB using 1 MB chunks whereby each chunk can only be written once the previous one has been successfully written (no buffers), rather than trying to just write 1GB of data all at once.

Conclusion

Now anything you copy into /tmp can be accessed instantly. This could be great for video editing, custom-built applications that would benefit from fast I/O, or copying game files to for instant loading. Just remember that all this data will be lost if there is a power-cut or you reboot so it's better to copy files rather than move them.

References

Author

Programster

Stuart is a software developer with a passion for Linux and open source projects.

comments powered by Disqus