When should I use /dev/shm/ and when should I use /tmp/?

152

41

When should I use /dev/shm/ and when should I use /tmp/? Can I always rely on them both being there on Unices?

Deleted

Posted 2009-09-22T23:26:13.510

Reputation: 3 548

Answers

112

/dev/shm is a temporary file storage filesystem, i.e., tmpfs, that uses RAM for the backing store.  It can function as a shared memory implementation that facilitates IPC.

From Wikipedia:

Recent 2.6 Linux kernel builds have started to offer /dev/shm as shared memory in the form of a ramdisk, more specifically as a world-writable directory that is stored in memory with a defined limit in /etc/default/tmpfs.  /dev/shm support is completely optional within the kernel config file.  It is included by default in both Fedora and Ubuntu distributions, where it is most extensively used by the Pulseaudio application.             (Emphasis added.)

/tmp is the location for temporary files as defined in the Filesystem Hierarchy Standard, which is followed by almost all Unix and Linux distributions.

Since RAM is significantly faster than disk storage, you can use /dev/shm instead of /tmp for the performance boost, if your process is I/O intensive and extensively uses temporary files.

To answer your questions: No, you cannot always rely on /dev/shm being present, certainly not on machines strapped for memory. You should use /tmp unless you have a very good reason for using /dev/shm.

Remember that /tmp can be part of the / filesystem instead of a separate mount, and hence can grow as required. The size of /dev/shm is limited by excess RAM on the system, and hence you're more likely to run out of space on this filesystem.

user4358

Posted 2009-09-22T23:26:13.510

Reputation:

I see /dev/shm filling up with pulse-shm-######## files but have no idea why or how to stop it. – SDsolar – 2018-03-05T20:28:18.120

1I will be using it to redirect output from a commands' standard error output to a file. Then I will read this file and process it. I will be doing this several thousand times (it's part of the condition of a loop construct). I thought memory would be nice in this case. But I also want it to be portable. I guess I'll check if /dev/shm exists, use it if it does, or fallback to /tmp. Does that sound good? – Deleted – 2009-09-23T16:04:37.697

1I'd also add a check for the minimum size and current usage level of /dev/shm to guard against inadvertently filling it up. – None – 2009-09-23T21:01:17.740

4Under Linux 2.6 and later the /dev/shm is required to be mounted for the POSIX shared memory system calls like shm_open() to work. In other words some programs will break if its not mounted - so it should be. It is not just a RAM disk. So you should make sure some of /dev/shm is free. – EdH – 2012-11-30T21:07:56.357

8There is no performance boost by using /dev/shm. /dev/shm is memory (tmpfs) backed by the disk (swap). /var/tmp is memory (disk cache) backed by the disk (on-disk filesystem). In practice, performance is about the same (tmpfs has a slight edge but not enough to matter). /tmp may be tmpfs or not depending on how the administrator configured it. There is no good reason to use /dev/shm in your scripts. – Gilles 'SO- stop being evil' – 2013-06-18T07:13:50.333

@nagul how to check current usage level of /dev/shm? du command always shows 0 for used – balki – 2013-12-03T20:09:48.613

1@Gilles - I don't quite understand your comment, why do your statements mean there's never a good reason to use /dev/shm ?? Are you saying there's never a good reason to use memory backed by swap? – Garet Claborn – 2014-06-05T01:05:43.610

3@GaretClaborn There's plenty of good reasons to use memory backed by swap, but that's called normal process memory. If you're using a file, it's called a filesystem, and all filesystems are memory (cache), which is backed by swap if the filesystem is something like tmpfs. Allocating disk space between swap and other storage areas is typically in the real of the administrator. If an application wants files that tend to remain in RAM, /tmp is the normal location (with $TMPDIR to override). The choice to make /tmp backed by swap, other disk space or nothing is the administrator's. – Gilles 'SO- stop being evil' – 2014-06-05T14:09:29.380

@Gilles Hmm, well what I've been doing is that our app renders most of it's frontend HTML onto bulk storage. From the access logs, we make a priority list of most accessed URIs on the system and files go fill up /dev/shm in the same structure as rendered to disk. Then nginx will first try to serve from /dev/shm/sites/mysite.com/.. before falling back to the network storage, which finally falls back to the application if all hell breaks loose. I'm trying to figure out if this should be somewhere else. I don't think /tmp is reliable for this since we need to be on tmpfs for this to have any use – Garet Claborn – 2014-06-05T16:41:01.700

67

In descending order of tmpfs likelyhood:

┌───────────┬──────────────┬────────────────┐
│ /dev/shm  │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp      │ can be tmpfs │ FHS 1.0        │
├───────────┼──────────────┼────────────────┤
│ /var/tmp  │ never tmpfs  │ FHS 1.0        │
└───────────┴──────────────┴────────────────┘

Since you are asking about a Linux specific tmpfs mountpoint versus a portably defined directory that may be tmpfs (depending on your sysadmin and what's default for your distro), your question has two aspects, which other answers have emphasized differently:

  1. When to use these directories, based on good practice
  2. When it is appropriate to use tmpfs

Good practices

Conservative edition (mixture of conventions from FHS and common use):

  • When in doubt, use /tmp.
  • Use /var/tmp for large data that may not easily fit in ram.
  • Use /var/tmp for data that is beneficial to keep across reboots (like a cache).
  • Use /dev/shm as a side-effect of calling shm_open(). The intended audience is bounded buffers that are endlessly overwritten. So this is for long lived files whose content is volatile and not terribly large.
  • If still in doubt, provide a way for the user to override. For example, the mktemp program honors the TMPDIR environment variable.

Pragmatic edition:

Use /dev/shm when it is important to use tmpfs, /var/tmp when it is important not to, else /tmp.

Where tmpfs excels

fsync is a no-op on tmpfs. This syscall is the number one enemy of (IO) performance (and flash longevity, if you care about that), though if you find yourself using tmpfs (or eatmydata) just to defeat fsync, then you (or some other developer in the chain) are doing something wrong. It means that the transactions toward the storage device are unnecessarily fine grained for your purpose – you are clearly willing to skip some savepoints for performance, as you have now gone to the extreme of sabotaging them all – seldom the best compromise. Also, it is here in transaction performance land where some of the greatest benefits of having an SSD are – any decent SSD is going to perform out-of-this-world compared to what a spinning disk can possibly take (7200 rpm = 120 Hz, if notihing else is accessing it), not to mention flash memory cards, which vary widely on this metric (not least because it is a tradeoff with sequential performance, which is what they are rated by, e.g. SD card class rating). So beware, developers with blazing fast SSDs, not to force your users into this use case!

Wanna hear a ridiculous story? My first fsync lesson: I had a job that involved routinely "upgrading" a bunch of Sqlite databases (kept as testcases) to an ever-changing current format. The "upgrade" framework would run a bunch of scripts, making at least one transaction each, to upgrade one database. Of course, I upgraded my databases in parallel (8 in parallel, since I was blessed with a mighty 8 core CPU). But as I found out, there was no parallelization speedup whatsoever (rather a slight hit) because the process was entirely IO bound. Hilariously, wrapping the upgrade framework in a script that copied each database to /dev/shm, upgraded it there, and copied it back to disk was like 100 times faster (still with 8 in parallel). As a bonus, the PC was usable too, while upgrading databases.

Where tmpfs is appropriate

The appropriate use of tmpfs is to avoid unnecessary writing of volatile data. Effectively disabling writeback, like setting /proc/sys/vm/dirty_writeback_centisecs to infinity on a regular filesystem.

This has very little to do with performance, and failing this is a much smaller concern than abusing fsync: The writeback timeout determines how lazily the disk content is updated after the pagecache content, and the default of 5 seconds is a long time for a computer – an application can overwrite a file as frequently as it wants, in pagecache, but the content on disk is only updated about once every 5 seconds. Unless the application forces it through with fsync, that is. Think about how many times an application can output a small file in this time, and you see why fsyncing every single one would be a much bigger problem.

What tmpfs can not help you with

  • Read performance. If your data is hot (which it better be if you consider keeping it in tmpfs), you will hit the pagecache anyway. The difference is when not hitting the pagecache; if this is the case, go to "Where tmpfs sux", below.
  • Short lived files. These can live their entire lives in the pagecache (as dirty pages) before ever being written out. Unless you force it with fsync of course.

Where tmpfs sux

Keeping cold data. You might be tempted to think that serving files out of swap is just as efficient as a normal filesystem, but there are a couple of reasons why it isn't:

  • The simplest reason: There is nothing that contemporary storage devices (be it harddisk or flash based) loves more than reading fairly sequential files neatly organized by a proper filesystem. Swapping in 4KiB blocks is unlikely to improve on that.
  • The hidden cost: Swapping out. Tmpfs pages are dirty — they need to be written somewhere (to swap) to be evicted from pagecache, as opposed to file backed clean pages that can be dropped instantly. This is an extra write penalty on everything else that competes for memory – affects something else at a different time than the use of those tmpfs pages.

user2394284

Posted 2009-09-22T23:26:13.510

Reputation: 871

In my ubuntu 14.04 /dev/shm is link to /run/shm, that has filesystem "none" according to command df. Size is about 2G, though. – jarno – 2016-12-14T08:41:04.017

3@jarno Firstly, economizing the number of tmpfs mountpoints, I'd call an implementation detail. Secondly, don't let the device name confuse you – look in /proc/mounts (that's the right place to look), and you will see that the type is "tmpfs" while the device is what's "none" here. Yes, the device name means nothing in tmpfs – you can mount -t tmpfs "jarno is great" /mnt/jarno if you like! Thirdly, the default size is half the amount of RAM – I bet you have 4GiB RAM. – user2394284 – 2016-12-22T19:04:14.270

1Is there an option that allocates a fixed RAM size and promises to never use swap? – palswim – 2017-07-28T21:44:50.427

@palswim: That would be a ramdisk. I don't see an option for that in tmpfs, other than that tmpfs' predecessor didn't support swapping. Processes can lock their pages in ram, which is arguably less crazy than locking tmpfs pages in ram, considering that the OOM killer is unable to free up the latter, should you run out of memory.

– user2394284 – 2017-08-17T14:18:32.540

19

Okay, here's the reality.

Both tmpfs and a normal filesystem are a memory cache over disk.

The tmpfs uses memory and swapspace as it's backing store a filesystem uses a specific area of disk, neither is limited in the size the filesystem can be, it is quite possible to have a 200GB tmpfs on a machine with less than a GB of ram if you have enough swapspace.

The difference is in when data is written to the disk. For a tmpfs the data is written ONLY when memory gets too full or the data unlikely to be used soon. OTOH most normal Linux filesystems are designed to always have a more or less consistent set of data on the disk so if the user pulls the plug they don't lose everything.

Personally, I'm used to having operating systems that don't crash and UPS systems (eg: laptop batteries) so I think the ext2/3 filesystems are too paranoid with their 5-10 second checkpoint interval. The ext4 filesystem is better with a 10 minute checkpoint, except it treats user data as second class and doesn't protect it. (ext3 is the same but you don't notice it because of the 5 second checkpoint)

This frequent checkpointing means that unnecessary data is being continually written to disk, even for /tmp.

So the result is you need to create swap space as big as you need your /tmp to be (even if you have to create a swapfile) and use that space to mount a tmpfs of the required size onto /tmp.

NEVER use /dev/shm.

Unless, you're using it for very small (probably mmap'd) IPC files and you are sure that it exists (it's not a standard) and the machine has more than enough memory + swap available.

Robert

Posted 2009-09-22T23:26:13.510

Reputation: 191

25Agreed, except for the conclusion, "NEVER use /dev/shm". You want to use /dev/shm in cases where you don't want a file to be written to the disk at all, and you want to minimize disk i/o. For example, I need to download very large zip files from an FTP server, unzip them, and then import them into a database. I unzip to /dev/shm so that for both the unzip and the import operations the HDD only needs to perform half the operation, rather than moving back and forth between source and destination. It speeds up the process immensely. That's one example of many, but I agree that it's a niche tool. – Nathan Stretch – 2014-12-11T23:13:47.817

4

Use /tmp/ for temporary files. Use /dev/shm/ when you want shared memory (ie, interprocess communication through files).

You can rely on /tmp/ being there, but /dev/shm/ is a relatively recent Linux only thing.

Captain Segfault

Posted 2009-09-22T23:26:13.510

Reputation: 1 224

Isn't there a performance aspect as well? As /dev/shm is most often mounted as a tmpfs volume and essentially a RAM-disk? – Deleted – 2009-09-23T09:37:23.207

You can also mount /tmp as a tmpfs filesystem, I do so on my netbook to speed some things up by reducing writes to the (slow) SSD. There are disadvantages to doing so, of course (mainly the RAM use, but my netbook has far more RAM than it generally needs anyway). – David Spillett – 2009-09-23T10:55:17.760

For my specific case I would use it for a sort of process communication. I capture the output of standard error from an application and act on the contents (and I still need the standard output untouched, so I can't do any 1>/dev/null 2>&1. I would do this several thousand times so a tmpfs would be nice. However if I release the script I can't rely on tmpfs being used for /tmp as I think it's not that common. If it's more common for /dev/shm then that's better for me. But I'm looking for guidelines regarding portability etc. – Deleted – 2009-09-23T16:00:51.933

2

Another time when you should use /dev/shm (for Linux 2.6 and above) is when you need a guaranteed tmpfs file system because you don't know if you can write to disk.

A monitoring system I'm familiar with needs to write out temporary files while building its report for submission to a central server. It's far more likely in practice that something will prevent writes to a file system (either out of disk space or an underlying RAID failure has pushed the system into a hardware read-only mode) but you'll still be able to limp along to alert about it than if something spirals all available memory such that tmpfs will be unusable (and the box won't be dead). In cases like this, a monitoring system will prefer writing out to RAM so as to potentially be able to send an alert about a full disk or dead/dying hardware.

Japheth Cleaver

Posted 2009-09-22T23:26:13.510

Reputation: 21

0

/dev/shm is used for shared virtual memory system specific device drivers and programs.

If you are creating a program that requires a virtual memory heap that should be mapped to virtual memory. This goes double so if you need multiple processes or threads to be able to safely access that memory.

The fact is that just because the driver uses a special version of tmpfs for it, doesn't mean you should use it as a generic tmpfs partition. Instead, you should just create another tmpfs partition if you want one for your temporary directory.

Robert Wm Ruedisueli

Posted 2009-09-22T23:26:13.510

Reputation: 167

0

In PERL, having 8GB minimum on any machine (all running Linux Mint), I am of what I think is a good habit of doing DB_File-based (data structure in a file) complex algorithms with millions of reads and writes using /dev/shm

In other languages, not having gigether everywhere, to avoid the starts and stops in network transfer (working locally on a file that is located on a server in a client-server atmosphere), using a batch file of some type, I will copy the whole (300-900MB) file at once to /dev/shm, run the program with output to /dev/shm, write the results back to the server, and delete from /dev/shm

Naturally, if I had less RAM, I would not be doing this. Ordinarily, the in-memory file system of /dev/shm reads as a size being one half of your available RAM. However, ordinary use of RAM is constant. So you really couldn't do this on a device with 2GB or less. To turn paraphrase to hyperbole, there is often things in RAM that even the system doesn't report well.

David Grove

Posted 2009-09-22T23:26:13.510

Reputation: 1

(I think this is in the spirit of what was originally asked.) What I mean basically is that I'm comfortable using /dev/shm as a RAM disk as long as I have sufficient memory. If it is inefficient to do so somehow, that should not dissuade you from doing so, but should trigger a question like "How can I have a ram disk on linux?". The answer is /dev/shm – David Grove – 2015-09-27T21:44:42.890