Firefox/Profile on RAM

From ArchWiki

Assuming that there is memory to spare, placing Firefox's cache or complete profile to RAM offers significant advantages. Even though opting for the partial route is an improvement by itself, the latter can make Firefox even more responsive compared to its stock configuration. Benefits include, among others:

  • reduced drive read/writes;
  • heightened responsive feel;
  • many operations within Firefox, such as quick search and history queries, are nearly instantaneous.

To do so we can make use of a tmpfs.

Because data placed therein cannot survive a shutdown, a script responsible for syncing back to drive prior to system shutdown is necessary if persistence is desired (which is likely in the case of profile relocation). On the other hand, only relocating the cache is a quick, less inclusive solution that will slightly speed up user experience while emptying Firefox cache on every reboot.

Note: Cache is stored separately from Firefox default profiles' folder (/home/$USER/.mozilla/firefox/): it is found by default in /home/$USER/.cache/mozilla/firefox/<profile>. This is similar to what Chromium and other browsers do. Therefore, sections #Place profile in RAM using tools and #Place profile in RAM manually do not deal with cache relocating and syncing but only with profile adjustments. See the note at Profile-sync-daemon#Design goals and benefits of psd for more details. Anything-sync-daemon may be used to achieve the same thing as Option 2 for cache folders.

Relocate cache to RAM only

See Firefox/Tweaks#Turn off the disk cache.

Place profile in RAM using tools

Relocate the browser profile to tmpfs so as to globally improve browser's responsiveness. Another benefit is a reduction in drive I/O operations, of which SSDs benefit the most.

Use an active management script for maximal reliability and ease of use. Several are available from the AUR.

Place profile in RAM manually

Before you start

Before potentially compromising Firefox's profile, be sure to make a backup for quick restoration. First, find out the active profile name by visiting about:profiles and checking which profile is in use. Replace xyz.default as appropriate and use tar to make a backup:

$ tar zcvfp ~/firefox_profile_backup.tar.gz ~/.mozilla/firefox/xyz.default

The script

Adapted from verot.net's Speed up Firefox with tmpfs

The script will first move Firefox's profile to a new static location, make a sub-directory in /dev/shm, softlink to it and later populate it with the contents of the profile. As before, and until the end of this article, replace the bold xyz.default strings with the name of your your Firefox profile folder. The only value that absolutely needs to be altered is, again, xyz.default.

Be sure that rsync is installed, create:

~/.local/bin/firefox-sync.sh
#!/bin/sh

static=static-$1
link=$1
volatile=/dev/shm/firefox-$1-$USER

IFS=
set -efu

cd ~/.mozilla/firefox

if [ ! -r $volatile ]; then
	mkdir -m0700 $volatile
fi

if [ "$(readlink $link)" != "$volatile" ]; then
	mv $link $static
	ln -s $volatile $link
fi

if [ -e $link/.unpacked ]; then
	rsync -av --delete --exclude .unpacked ./$link/ ./$static/
else
	rsync -av ./$static/ ./$link/
	touch $link/.unpacked
fi

Make the script executable, then run the following to close Firefox and test it:

$ killall firefox firefox-bin
$ ls ~/.mozilla/firefox/
$ ~/.local/bin/firefox-sync.sh xyz.default

Run Firefox again to gauge the results. The second time the script runs, it will then preserve the RAM profile by copying it back to disk.

Automation

Seeing that forgetting to sync the profile can lead to disastrous results, automating the process seems like a logical course of action.

systemd

Create the following script:

~/.config/systemd/user/[email protected]
[Unit]
Description=Firefox profile memory cache

[Install]
WantedBy=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=%h/.local/bin/firefox-sync.sh %i
ExecStop=%h/.local/bin/firefox-sync.sh %i

then, do a daemon-reload and enable/start the firefox-profile@xyz.default.service user unit.

cron job

Manipulate the user's cron table using crontab:

$ crontab -e

Add a line to start the script every 30 minutes,

*/30 * * * * ~/.local/bin/firefox-sync.sh xyz.default

or add the following to do so every 2 hours:

0 */2 * * * ~/.local/bin/firefox-sync.sh xyz.default

Sync at login/logout

Assuming bash is being used, add the script to the login/logout files:

$ echo 'bash -c "~/.local/bin/firefox-sync.sh xyz.default > /dev/null &"' | tee -a ~/.bash_logout ~/.bash_login
Note: You may wish to use ~/.bash_profile instead of ~/.bash_login as bash will only read the first of these if both exist and are readable.

For ZSH, use ~/.zlogin and ~/.zlogout instead:

$ echo 'bash -c "~/.local/bin/firefox-sync.sh xyz.default > /dev/null &"' | tee -a ~/.zlog{in,out}

See also