5 ms·
Save your disk, write files directly into RAM with /dev/shm
- hackyhacky 1y agoRather than re-write your scripts to store temp files into /dev/shm, you can just mount /tmp using the tmpfs file system and get the same benefit for all your programs. Some distros do this by default. The relevant line from fstab is: tmpfs /tmp tmpfs noatime 0 2 Now any program that writes to /tmp will be writing to a RAM disk, thus sparing unnecessary wear on my SSD.
- frollogaston 1y agoIf I already have /tmp and it's not tmpfs, honestly I'm not gonna bother remapping it.
- hiAndrewQuinn 1y agoI do mention this offhand in the article: "The existence of /dev/shm is a boon for me mostly because it means I never have to worry about whether /tmp is really RAM-based again."
- quotemstr 1y agoNow you have to worry about whether you can access /dev/shm. Please encourage people to use supported interfaces instead of random voodoo (anything under /dev that wasn't there in 1995) for day-to-day tasks.
- hiAndrewQuinn 1y ago/dev/shm is typically world-writable by default: $ ls -ld /dev/shm drwxrwxrwt 3 root root 120 Jun 32 02:47 /dev/shm/ Incidentally, "30 years ago" is the cutoff date for music being considered the oldies. This just made me realize Nevermind is now an oldie, and soon The Lonesome Crowded West will be too.
- quotemstr 1y ago> /dev/shm is typically world-writable by default: You are relying on random implementation details instead of universal APIs that work across OSes and environments. Please stop. So help me God, if I make a Linux system, I will make it _not_ have a /dev/shm just to avoid people relying on non-standard stuff for no good reason. Honestly, it's because of stuff like this that we need Docker.
- deleted 1y ago[deleted]
- half-kh-hacker 1y agofile-hierarchy(7) states /dev/shm is tmpfs and that "all users have write access to this directory", so I think you'd have to be making a non-systemd distro
- hackyhacky 1y agoIt also says: > Usually, it is a better idea to use memory mapped files in /run/ (for system programs) or $XDG_RUNTIME_DIR (for user programs) instead of POSIX shared memory segments, since these directories are not world-writable and hence not vulnerable to security-sensitive name clashes. $XDG_RUNTIME_DIR usually points to /run/user/${uid}, so you're guaranteed that other users won't write there, and possibly won't even be able to read there.
- frollogaston 1y ago/tmp isn't a standard place for RAM disk either, all it says is: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.htm... I'm not really seeing a right or wrong here anyway unless you're distributing a script that's meant to run on all sorts of Linux systems. In which case you probably aren't concerned with the physical storage medium being used.
- quotemstr 1y ago
- wredcoll 1y agoThis is a ridiculous comment but it did make me curious, when did /dev/shm become a common thing? My current understanding is kernel 2.6, i.e. 2004.
- esseph 1y ago2.4 in 2001 is when it was released with kernel support
- frollogaston 1y ago"virtually every Unix system already has it mounted as a tmpfs by default" might be true if you say Linux instead, but Mac doesn't have /dev/shm
- loeg 1y agoI may misremember, but I think it's also common in the BSDs? (Whereas /var/tmp is persisted.)
- frollogaston 1y agoYeah, Mac is probably the odd one out, but it's also maybe the most common Unix-based/Unix-like desktop OS. Anyway, both are POSIX, unlike Linux.
- hiAndrewQuinn 1y agoMea culpa, you're right. I should not have assumed that just because POSIX was mentioned in the orbit of this thing that everyone else had this too. The article has been corrected.
- AdieuToLogic 1y agoOS-X/macOS supports RAM drives and a script which defines one for use as /private/tmp (which /tmp is symbolically linked to) is: #!/bin/bash ramfs_size_mb=1024 mount_point=/private/tmp counter=0 ramfs_size_sectors=$((${ramfs_size_mb}*2048)) ramdisk_dev=`hdiutil attach -nomount ram://${ramfs_size_sectors}` while [[ ! -d "/Volumes" ]] do sleep 1 counter=$((counter + 1)) if [[ $counter -gt 10 ]] then echo "$O: /Volumes never created" exit 1 fi done diskutil eraseVolume HFS+ 'RAM Disk' ${ramdisk_dev} || { echo "$O: unable to create RAM Disk on: ${ramdisk_dev}" exit 2 } umount '/Volumes/RAM Disk' mkdir -p ${mount_point} 2>/dev/null mount -o noatime -t hfs ${ramdisk_dev} ${mount_point} || { echo "$0: unable to mount ${ramdisk_dev} ${mount_point}" exit 3 } chown root:wheel ${mount_point} chmod 1777 ${mount_point} Adding a plist definition to /Library/LaunchDaemons can ensure the above is executed when the system starts.
- chrisdeso 1y agoThis is the first linux "thing" I've understood after a first read on hacker news. Love you all and will give this a whirl.
- pkulak 1y agoI did this for a while, but writing files to ram can be dangerous, since most things assume unlimited disk space. I noticed that updates would fail on machines that had 16 gigs of ram unless I logged out of my window manager and did it from the TTY. Took quite a long time to realize it was because of all the compiles writing to /tmp. Much easier to just let the SSD get used.
- buckle8017 1y agoThis is why having swap even when you have plenty of memory for normal usage is good. Swap on an SSD isn't even that slow.
- pkulak 1y agoYou know what, your comment actually reminds me that this happened when I also had a bug in my configuration that was causing me to not actually use swap. I assume running out of tmpfs uses swap like anything else? I might give tmpfs another try.
- AdieuToLogic 1y ago> I assume running out of tmpfs uses swap like anything else? This is not the case. RAM-based file system capacities are unrelated to process memory usage, of which "swap space" is for the latter.
- pkulak 1y agoInteresting, thank you. I stand by my original point, downvotes be damned.
- AdieuToLogic 1y ago> Interesting, thank you. Glad to help out. Here[0] is more information regarding Linux swap space as it relates to processes and the VMM subsystem. > I stand by my original point, downvotes be damned. :-D 0 - https://phoenixnap.com/kb/swap-space https://phoenixnap.com/kb/swap-space
- b112 1y agoA decade ago yes, but these days, SSD wear isn't an issue for desktop users.
- pm2222 1y agoSystemd clears /tmp from time to time. Just saying.
- godelski 1y agoAnother thing you can do is use systemd and use the privatetmp option. You really should be doing this on all your services
- ryoshu 1y agoI remember using a RAM disk on the IBM PCjr.
- slt2021 1y agoI use jupyter notebooks for similar purpose, with the Python kernel's memory keeping the state I want for some random stuff, and notebook being a recipe how to reproduce the calculation/processing. some of my kernels been running for weeks, as I come back and redo or rework some processing. the neat thing about jupyter notebooks, is you can interleave python one-liners with bash one-liners and mix them as you wish.
- quotemstr 1y agoThis is what /tmp IS FOR. No need to be clever.
- 1970-01-01 1y agoI think Debian still uses disk space for files in /tmp. YMMV.
- necheffa 1y agoThis will change starting with Trixie. Of course, I have always manually configured tmpfs for /tmp/ since Jessie as part of my post-install checklist.
- frollogaston 1y ago/tmp is for temporary files, that's all. It's not about the storage medium.
- ctur 1y agoThis is an unnecessary optimization, particularly for the article's use case (small files that are read immediately after being written). Just use /tmp. The linux buffer cache is more than performant enough for casual usage and, indeed, most heavy usage too. It's far too easy to clog up memory with forgotten files by defaulting to /dev/shm, for instance, and you potentially also take memory away from the rest of the system until the next reboot. For the author's purposes, any benefit is just placebo. There absolutely are times where /dev/shm is what you want, but it requires understanding nuances and tradeoffs (e.g. you are already thinking a lot about the memory management going on, including potentially swap). Don't use -funroll-loops either.
- chaps 1y agoThis isn't great advice because /tmp is not always mounted as tmpfs. I've used /dev/shm extensively for large datasets and it's consistently been a massive speed improvement. Not sure what you're talking about.
- quotemstr 1y ago> This isn't great advice because /tmp is not always mounted as tmpfs. Well, complain to whoever's mounting it wrong to fix it.
- chaps 1y agoNot sure your aggression is warranted, friend. Many distros over the years have had tmpfs mounted and many distros over the years haven't. Some hosts should have tmpfs mounted and some shouldn't. For those that don't, I can just /dev/shm. This isn't a "right" or "wrong" sorta thing.
- hiAndrewQuinn 1y agoIt's true that with small files, my primary interest is simply not to wear on my disk unnecessarily. However I do also often do work on large files, usually local data processing work. "This optimization [of putting files directly into RAM instead of trusting the buffers] is unnecessary" was an interesting claim, so I decided to put it to the test with `time`. $ # Drop any disk caches first. $ sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches' $ $ # Read a 3.5 GB JSON Lines file from disk. $ time wc -l /home/andrew/Downloads/kaikki.org-dictionary-Finnish.jsonl 255111 /home/andrew/Downloads/kaikki.org-dictionary-Finnish.jsonl real 0m2.249s user 0m0.048s sys 0m0.809s $ # Now with caching. $ time wc -l /dev/shm/kaikki.org-dictionary-Finnish.jsonl 255111 /dev/shm/kaikki.org-dictionary-Finnish.jsonl real 0m0.528s user 0m0.028s sys 0m0.500s $ $ # Drop caches again, just to be certain. $ sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches' $ $ # Read that same 3.5 GB LSON Lines file from /dev/shm. $ time wc -l /dev/shm/kaikki.org-dictionary-Finnish.jsonl 255111 /dev/shm/kaikki.org-dictionary-Finnish.jsonl real 0m0.453s user 0m0.049s sys 0m0.404s Compared to the first read there is indeed a large speedup, from 2.2s down to under 0.5s. After the file had been loaded into cache from disk by the first `wc --lines`, however, the difference dropped to /dev/shm being about ~20% faster. Still significant, but not game-changingly so. I'll probably come back to this and run more tests with some of the more complex `jq` query stuff I have to see if we stay at that 20% mark, or if it gets faster or slower.
- hacker_homie 1y agoJust mount tmpfs where you have frequent writes.
- pizlonator 1y agoThe reason why this might be a bad idea is that /dev/shm is used for shm_open(3). So in theory some program might pass a name to shm_open that collides with whatever you put in /dev/shm. Unlikely but possible
- layer8 1y agoHow is that different from two unrelated programs using shm_open with conflicting file names? Such programs need to ensure unique names anyway.
- pizlonator 1y agoExpecting a program to do that is one thing. Expecting yourself to do that when you use /dev/sum is another
- Waterluvian 1y agoAn assumption I’ve been revisiting is if I really do need to be writing to disk all the time. I can’t remember the last time I actually had a crash or other event where I would have abruptly lost my work. I’m wondering if I can completely hide away the detail where I can work exclusively in memory (even when I habitually save my code) and “reconcile” as some task I do before shutdown. In fact, that doesn’t even feel necessary… I git push my day’s work a number of times. None of that needs a local disk. And 64GB of memory was surprisingly affordable.
- wredcoll 1y agoYay, thin clients!
- Waterluvian 1y agoWe did it! We’re back to where we came from!
- hiAndrewQuinn 1y agoYou might be interested in Tiny Core Linux [0], then, especially piCore. After the initial read from the persistent media, everything is in RAM, the entire filesystem. You are working exclusively in memory until and unless you run a specific command to save everything you care to save back to that media again. I have it running on a Raspberry Pi so that my already sparingly-used SD card's lifespan gets extended to, hopefully, several years. I have never seen the green writing LED light blink on without me specifically triggering it. I primarily use it as a cronslave [1]. It has ~50 separate cronjobs on it by now, all wheedling away at various things I want to make happen for free on a clock. But if you live out of a terminal and could spend your days happily inside tmux + vim or emacs -nw, there's nothing stopping you from just doing this. Feels a lot like driving stick shift. [0]: http://tinycorelinux.net/ http://tinycorelinux.net/ [1]: https://hiandrewquinn.github.io/til-site/posts/consider-the-cronslave/ https://hiandrewquinn.github.io/til-site/posts/consider-the-...
- radlad 1y ago
- Jhsto 1y agoSpeaking of RAM and disks, does anyone know what happens if you structure LVM volume such that there is a RAM based tmpfs as a front cache? Consistency issues aside, could it increase performance? Suppose I have an application that behaves such that it has very IO heavy write buffer of around 100GB with 10x or so NVMe backed storage for more rarely used data. Would you do something else? The main problem I have currently is that the NVMes overheat occasionally from high IOPS which adds a lot of latency variance.
- theblazehen 1y agoDoes the page cache not already do that? You can tweak the writeback delay etc
- molticrystal 1y agoFor those interested in a windows equivalent, with bells and whistles, ImDisk [0] has a nice ramdisk creation utility with options such as allocating memory dynamically, ntfs compression, and more. For the more venturous there is GPURamDrive [1] , not as many options, as it was made as a more of an experiment, but with gpu's adding more and more vram, why not? [0] https://sourceforge.net/projects/imdisk-toolkit/ https://sourceforge.net/projects/imdisk-toolkit/ [1] https://github.com/abesada/GpuRamDrive https://github.com/abesada/GpuRamDrive
- deleted 1y ago[deleted]
- 1vuio0pswjnm7 1y agoFor decades now I have been using RAM (mfs, tmpfs) as "disk", i.e., boot from USB, no internal HDD, no internal SSD.^1 Entire OS fits in memory. When compiling OS userland there is simply no comparison; disk is painfully slow. I am not a gamer. I use RAM as a filesystem and workspace. I just got another computer with 64GB RAM. I will get 96GB or more when price comes down. 1. I use removable, external drives for anything I want to save long-term. No "cloud" storage.
- scriu 1y agoI like distros that can be run only in ram. I wish that i could run windows like that but you need a lot of ram.
- pizza234 1y agoLittle trick for developers: put the database transaction log in /dev/shm (ensure that it's not too large), and some operations will be enormously faster.
- amai 1y agoBack to the 90s, when Amiga OS had a dynamically sized RAM disk by default and showed an icon for it in the GUI like for any other device. It even offered a persistant RAM drive. https://grimore.org/amiga/rad https://grimore.org/amiga/rad It seems the advantage of this has been mostly forgotten.
- navbaker 1y agoThis may be an ignorant question, but does this also work for operations inside a container’s filesystem?
- hulitu 1y ago> Save your disk, write files directly into RAM with /dev/shm Even better: write them to /dev/null
- Fire-Dragon-DoL 1y agoThe big downside of /tmp being ram based is that it is limited to ram size. Once I was using it to store a large file (50gb) and I saturated my RAM.