[PERFORM] Defaulting wal_sync_method to fdatasync on Linux for 9.1?

2010-10-31 Thread Marti Raudsepp
Hi pgsql-performance,

I was doing mass insertions on my desktop machine and getting at most
1 MB/s disk writes (apart from occasional bursts of 16MB). Inserting 1
million rows with a single integer (data+index 56 MB total) took over
2 MINUTES! The only tuning I had done was shared_buffers=256MB. So I
got around to tuning the WAL writer and found that wal_buffers=16MB
works MUCH better. wal_sync_method=fdatasync also got similar results.

First of all, I'm running PostgreSQL 9.0.1 on Arch Linux
* Linux kernel 2.6.36 (also tested with 2.6.35.
* Quad-core Phenom II
* a single Seagate 7200RPM SATA drive (write caching on)
* ext4 FS over LVM, with noatime, data=writeback

I am creating a table like: create table foo(id integer primary key);
Then measuring performance with the query: insert into foo (id) select
generate_series(1, 100);

130438,011 mswal_buffers=64kB, wal_sync_method=open_datasync  (all defaults)
29306,847 ms wal_buffers=1MB, wal_sync_method=open_datasync
4641,113 ms  wal_buffers=16MB, wal_sync_method=open_datasync
^ from 130s to 4.6 seconds by just changing wal_buffers.

5528,534 ms wal_buffers=64kB, wal_sync_method=fdatasync
4856,712 ms wal_buffers=16MB, wal_sync_method=fdatasync
^ fdatasync works well even with small wal_buffers

2911,265 mswal_buffers=16MB, fsync=off
^ Not bad, getting 60% of ideal throughput

These defaults are not just hurting bulk-insert performance, but also
everyone who uses synchronus_commit=off

Unless fdatasync is unsafe, I'd very much want to see it as the
default for 9.1 on Linux (I don't know about other platforms).  I
can't see any reasons why each write would need to be sync-ed if I
don't commit that often. Increasing wal_buffers probably has the same
effect wrt data safety.

Also, the tuning guide on wiki is understating the importance of these
tunables. Reading it I got the impression that some people change
wal_sync_method but it's dangerous and it even literally claims about
wal_buffers that 1MB is enough for some large systems

But the truth is that if you want any write throughput AT ALL on a
regular Linux desktop, you absolutely have to change one of these. If
the defaults were better, it would be enough to set
synchronous_commit=off to get all that your hardware has to offer.

I was reading mailing list archives and didn't find anything against
it either. Can anyone clarify the safety of wal_sync_method=fdatasync?
Are there any reasons why it shouldn't be the default?

Regards,
Marti

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Defaulting wal_sync_method to fdatasync on Linux for 9.1?

2010-10-31 Thread Greg Smith

Marti Raudsepp wrote:

Unless fdatasync is unsafe, I'd very much want to see it as the
default for 9.1 on Linux (I don't know about other platforms).  I
can't see any reasons why each write would need to be sync-ed if I
don't commit that often. Increasing wal_buffers probably has the same
effect wrt data safety.
  


Writes only are sync'd out when you do a commit, or the database does a 
checkpoint.


This issue is a performance difference introduced by a recent change to 
Linux.  open_datasync support was just added to Linux itself very 
recently.  It may be more safe than fdatasync on your platform.  As new 
code it may have bugs so that it doesn't really work at all under heavy 
load.  No one has really run those tests yet.  See 
http://wiki.postgresql.org/wiki/Reliable_Writes for some background, and 
welcome to the fun of being an early adopter.  The warnings in the 
tuning guide are there for a reason--you're in untested territory now.  
I haven't finished validating whether I consider 2.6.32 safe for 
production use or not yet, and 2.6.36 is a solid year away from being on 
my list for even considering it as a production database kernel.  You 
should proceed presuming that all writes are unreliable until proven 
otherwise.


--
Greg Smith   2ndQuadrant USg...@2ndquadrant.com   Baltimore, MD
PostgreSQL Training, Services and Supportwww.2ndQuadrant.us
PostgreSQL 9.0 High Performance: http://www.2ndQuadrant.com/books


--
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Defaulting wal_sync_method to fdatasync on Linux for 9.1?

2010-10-31 Thread Andres Freund
On Sunday 31 October 2010 20:59:31 Greg Smith wrote:
 Writes only are sync'd out when you do a commit, or the database does a 
 checkpoint.
Hm?  WAL is written out to disk after an the space provided by wal_buffers(def 
8) * XLOG_BLCKSZ (def 8192) is used. The default is 64kb which you reach 
pretty quickly - especially after a checkpoint. With O_D?SYNC that will 
synchronously get written out during a normal XLogInsert if hits a page 
boundary.
*Additionally* its gets written out at a commit if sync commit is not on.

Not having a real O_DSYNC on linux until recently makes it even more dubious 
to have it as a default...


Andres

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Defaulting wal_sync_method to fdatasync on Linux for 9.1?

2010-10-31 Thread Marti Raudsepp
On Sun, Oct 31, 2010 at 21:59, Greg Smith g...@2ndquadrant.com wrote:
 open_datasync support was just added to Linux itself very recently.

Oh I didn't realize it was a new feature. Indeed O_DSYNC support was
added in 2.6.33

It seems like bad behavior on PostgreSQL's part to default to new,
untested features.

I have updated the tuning wiki page with my understanding of the problem:
http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server#wal_sync_method_wal_buffers

Regards,
Marti

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Defaulting wal_sync_method to fdatasync on Linux for 9.1?

2010-10-31 Thread Mark Kirkwood

On 01/11/10 08:59, Greg Smith wrote:

Marti Raudsepp wrote:

Unless fdatasync is unsafe, I'd very much want to see it as the
default for 9.1 on Linux (I don't know about other platforms).  I
can't see any reasons why each write would need to be sync-ed if I
don't commit that often. Increasing wal_buffers probably has the same
effect wrt data safety.


Writes only are sync'd out when you do a commit, or the database does 
a checkpoint.


This issue is a performance difference introduced by a recent change 
to Linux.  open_datasync support was just added to Linux itself very 
recently.  It may be more safe than fdatasync on your platform.  As 
new code it may have bugs so that it doesn't really work at all under 
heavy load.  No one has really run those tests yet.  See 
http://wiki.postgresql.org/wiki/Reliable_Writes for some background, 
and welcome to the fun of being an early adopter.  The warnings in the 
tuning guide are there for a reason--you're in untested territory 
now.  I haven't finished validating whether I consider 2.6.32 safe for 
production use or not yet, and 2.6.36 is a solid year away from being 
on my list for even considering it as a production database kernel.  
You should proceed presuming that all writes are unreliable until 
proven otherwise.




Greg,

Your reply is possibly a bit confusingly worded - Marti was suggesting 
that fdatasync be the default - so he wouldn't be a new adopter, since 
this call has been implemented in the kernel for ages. I guess you were 
wanting to stress that *open_datasync* is the new kid, so watch out to 
see if he bites...


Cheers

Mark