This hack is an old chestnut among PostgreSQL performance tuners, but it doesn't seem to be widely known elsewhere. That's a shame, because it's pure win, and it's ridiculously easy to set up. You don't even need to restart PostgreSQL.
Here's the situation: PostgreSQL writes certain temporary statistics. These go in the dir given by the stats_temp_directory
setting. By default, that's pg_stat_tmp
in the data dir. Temp files get written a lot, but there's no need for them to persist.
That makes them perfect candidates for a ramdisk (a.k.a. RAM drive). A ramdisk is a chunk of memory treated as a block device by the OS. Because it's RAM, it's super-fast. As far as the app is concerned, the ramdisk just holds a filesystem that it can read and write like any other. Moreover, PostgreSQL generally only needs a few hundred kilobytes for stats_temp_directory
; any modern server can fit that in RAM.
In Linux, you set up a ramdisk like this:
As root
:
'mkdir /var/lib/pgsql_stats_tmp'
[1]
'chmod 777 /var/lib/pgsql_stats_tmp'
'chmod +t /var/lib/pgsql_stats_tmp'
Add this line to /etc/fstab
. That 2G is an upper limit; the system will use only as much as it needs.
tmpfs /var/lib/pgsql_stats_tmp tmpfs size=2G,uid=postgres,gid=postgres 0 0
'mount /var/lib/pgsql_stats_tmp'
Then, as postgres
:
Change the stats_temp_directory setting in postgresql.conf:
stats_temp_directory = '/var/lib/pgsql_stats_tmp'
Tell PostgreSQL to re-read its configuration:
'pg_ctl -D YOUR_DATA_DIR reload
'
And that's it!
Other operating systems have different ways to set up ramdisks. Perhaps I'll cover them in a later post.
[1] The directory /var/lib/pgsql_stats_tmp
is an arbitrary choice, but it works well for Debian's filesystem layout.