In this article We will discuss about
wal_sync_method and
wal_buffers for
PostgreSQL Tuning Paramater. OK, let's take down...
One purpose of
wal_sync_method is to tune such caching behavior.
The default behavior here is somewhat different from most of the
options. When the server source code is compiled, a series of possible
ways to write are considered. The one believed most efficient then
becomes the compiled-in default. This value is not written to the
postgresql.conf file at
initdb time though, making it different from other auto-detected, platform-specific values such as
shared_buffers.
Before adjusting anything, you should check what your platform detected as the fastest safe method using
SHOW; the following is a Linux example:
postgres=# show wal_sync_method;
wal_sync_method
-----------------
fdatasync
On both Windows and the Mac OS X platforms, there is a special
setting to make sure the OS clears any write-back caches. The safe value
to use on these platforms that turns on this behavior is as follows:
wal_sync_method=fsync_writethrough
If you have this setting available to you, you really want to use it!
It does exactly the right thing to make database writes safe, while not
slowing down other applications the way disabling an entire hard drive
write cache will do.
This setting will not work on all platforms however. Note that you
will see a performance drop going from the default to this value, as is
always the case when going from unsafe to reliable caching behavior.
On other platforms, tuning
wal_sync_method can be much more
complicated. It's theoretically possible to improve write throughput on
any UNIX-like system by switching from any write method that uses a
write/fsync or
write/fdatasync pair to using a true synchronous write. On platforms that support safe
DSYNC write behavior, you may already see this as your default when checking it with
SHOW:
wal_sync_method=open_datasync
Even though you won't see it explicitly listed in the configuration
file as such. If this is the case on your platform, there's little
optimization beyond that you can likely perform.
open_datasync is generally the optimal approach, and when available it can even use direct I/O as well to bypass the operating system cache.
The Linux situation is perhaps the most complicated. As shown in the last code, this platform will default to
fdatasync as the method used. It is possible to switch this to use synchronous writes with:
wal_sync_method=open_sync
Also, in many cases you can discover this is faster—sometimes much
faster—than the default behavior. However, whether this is safe or not
depends on your filesystem. The default filesystem on most Linux
systems,
ext3, does not handle
O_SYNC writes safely in many cases, which can result in corruption. See "PANIC caused by open_sync on Linux" at
http://archives.postgresql.org/pgsqlhackers/2007-10/msg01310.php
for an example of how dangerous this setting can be on that platform.
There is evidence that this particular area has fi nally been cleaned up
on recent (2.6.32) kernels when using the
ext4 filesystem instead, but this has not been tested extensively at the database level yet.
In any case, your own tests of
wal_sync_method
should include the "pull the cord" test, where you power the server off
unexpectedly, to make sure you don't lose any data with the method
you've used. Testing at a very high load for a long period of time is
also advisable, to find intermittent bugs that might cause a crash.
wal_buffers Parameter WAL settings
While the documentation on
wal_buffers suggests that the
default of 64 KB is sufficient as long as no single transaction exceeds
that value, in practice write-heavy benchmarks see optimal performance
at higher values than you might expect from that, at least 1 MB or more.
With the only downside being the increased use of shared memory, and as
there's no case where more than a single WAL segment could need to be
buffered, given modern server memory sizes the normal thing to do
nowadays is to just set:
wal_buffers=16MB
Then forget about it as a
potential bottleneck or item to tune further. Only if you're tight on
memory should you consider a smaller setting.