fsync and hardware write cache

Started by Nonameover 21 years ago3 messages
#1Noname
pgsql@mohawksoft.com

Something to think about:

if you run PostgreSQL with fsync on, but you use the hardware write cache
on your disk drives, how likely are you to lose data? Obviously, this is a
fairly limited problem, as it only applies to power down (which you can
control) or power loss where the risks may be reduced but not eliminated
with a UPS.

Does it make sense to add a platform specific call that will flush a write
cache when fsync is enable?

#2Manfred Spraul
manfred@colorfullife.com
In reply to: Noname (#1)
Re: fsync and hardware write cache

pgsql@mohawksoft.com wrote:

Something to think about:

if you run PostgreSQL with fsync on, but you use the hardware write cache
on your disk drives, how likely are you to lose data? Obviously, this is a
fairly limited problem, as it only applies to power down (which you can
control) or power loss where the risks may be reduced but not eliminated
with a UPS.

Does it make sense to add a platform specific call that will flush a write
cache when fsync is enable?

Pete Zaitsev from mysql wrote that there is a special call on Mac OS:
Quoting him:

Mac OS X also has this "optimization", but at least it provides an
alternative flush method for Database Servers:

fcntl(fd, F_FULLFSYNC, NULL)

can be used instead of fsync() to get true fsync() behavior.

I couldn't confirm this with a quick google search - perhaps someone
with MacOS docs (or mysql sources) should check it.

What might be useful is a test tool that benchmarks fsync: if it's
faster than the rotational speed of a 15k rpm disk then probably someone
caches the write calls.

--
Manfred

#3Steve Atkins
steve@blighty.com
In reply to: Manfred Spraul (#2)
Re: fsync and hardware write cache

On Mon, Aug 23, 2004 at 10:19:20PM +0200, Manfred Spraul wrote:

Does it make sense to add a platform specific call that will flush a write
cache when fsync is enable?

Pete Zaitsev from mysql wrote that there is a special call on Mac OS:
Quoting him:

Mac OS X also has this "optimization", but at least it provides an
alternative flush method for Database Servers:

fcntl(fd, F_FULLFSYNC, NULL)

can be used instead of fsync() to get true fsync() behavior.

I couldn't confirm this with a quick google search - perhaps someone
with MacOS docs (or mysql sources) should check it.

I can confirm it exists.

#define F_FULLFSYNC 51 /* fsync + ask the drive to flush to the media */

What might be useful is a test tool that benchmarks fsync: if it's
faster than the rotational speed of a 15k rpm disk then probably someone
caches the write calls.

I played with doing that - and can't find any system where a naive
looped write, fsync, write, fsync took more that about 600us, so I
guess I'm missing something somewhere.

Cheers,
Steve