Josh Berkus wrote:
> Greg,
> 
> > This is interesting, because test_fsync consistently reported a rate of
> > about half this when using open_datasync instead of the equal
> > performance I'm getting from the database.  I'll see if I can reproduce
> > that further, but it's no reason to be concerned about the change that's
> > been made I think.  Just more evidence that test_fsync has quirks left
> > to be sorted out.  But that's not backbranch material, it should be part
> > of 9.1 only refactoring, already in progress via the patch Josh
> > submitted.  There's a bit of time left to get that done.
> 
> Did you rerun test_sync with O_DIRECT entabled, using my patch?  The
> figures you had from test_fsync earlier were without O_DIRECT.

I have modified test_fsync with the attached, applied patch to report
cases where we are testing without O_DIRECT when only O_DIRECT would be
used by the server, and cases where O_DIRECT fails because of the file
system type.   Josh Berkus wanted the first case kept in case we decide
to offer non-direct-io options on machines that support direct i/o.

The new messages are:

        * This non-direct I/O option is not used by Postgres.

        ** This file system and its mount options do not support direct
        I/O, e.g. ext4 in journaled mode.
        
You can see the first one below in my output from Ubuntu:

        $ ./test_fsync 
        Ops-per-test = 2000
        
        Simple non-sync'ed write:
                8k write                           58.175 ops/sec
        
        Compare file sync methods using one write:
        (in wal_sync_method preference order, except fdatasync
        is Linux's default)
                open_datasync                                 n/a
                8k write, fdatasync                68.425 ops/sec
                8k write, fsync                    63.932 ops/sec
                fsync_writethrough                            n/a
                open_sync 8k write*                73.785 ops/sec
                open_sync 8k direct I/O write      82.929 ops/sec
        * This non-direct I/O option is not used by Postgres.
        
        Compare file sync methods using two writes:
        (in wal_sync_method preference order, except fdatasync
        is Linux's default)
                open_datasync                                 n/a
                8k write, 8k write, fdatasync      42.728 ops/sec
                8k write, 8k write, fsync          43.625 ops/sec
                fsync_writethrough                            n/a
                2 open_sync 8k writes*             37.150 ops/sec
                2 open_sync 8k direct I/O writes   43.722 ops/sec
        * This non-direct I/O option is not used by Postgres.
        
        Compare open_sync with different sizes:
        (This is designed to compare the cost of one large
        sync'ed write and two smaller sync'ed writes.)
                open_sync 16k write                46.428 ops/sec
                2 open_sync 8k writes              38.703 ops/sec
        
        Test if fsync on non-write file descriptor is honored:
        (If the times are similar, fsync() can sync data written
        on a different descriptor.)
                8k write, fsync, close             65.744 ops/sec
                8k write, close, fsync             63.077 ops/sec

I believe test_fsync now matches the backend code.  If we decide to
change things, it can be adjusted.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/tools/fsync/test_fsync.c b/src/tools/fsync/test_fsync.c
index cd2b1f2..562da66 100644
*** /tmp/8wSNdd_test_fsync.c	Sat Jan 15 18:42:58 2011
--- src/tools/fsync/test_fsync.c	Sat Jan 15 18:38:57 2011
*************** void
*** 163,169 ****
  test_sync(int writes_per_op)
  {
  	int			tmpfile, ops, writes;
! 
  	if (writes_per_op == 1)
  		printf("\nCompare file sync methods using one write:\n");
  	else
--- 163,170 ----
  test_sync(int writes_per_op)
  {
  	int			tmpfile, ops, writes;
! 	bool		fs_warning = false;
! 	
  	if (writes_per_op == 1)
  		printf("\nCompare file sync methods using one write:\n");
  	else
*************** test_sync(int writes_per_op)
*** 176,184 ****
  	 */
  #ifdef OPEN_DATASYNC_FLAG
  	if (writes_per_op == 1)
! 		printf(LABEL_FORMAT, "open_datasync 8k write");
  	else
! 	 	printf(LABEL_FORMAT, "2 open_datasync 8k writes");
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1)
--- 177,193 ----
  	 */
  #ifdef OPEN_DATASYNC_FLAG
  	if (writes_per_op == 1)
! 		printf(LABEL_FORMAT, "open_datasync 8k write"
! #if PG_O_DIRECT != 0
! 		"*"
! #endif
! 		);
  	else
! 	 	printf(LABEL_FORMAT, "2 open_datasync 8k writes"
! #if PG_O_DIRECT != 0
! 		"*"
! #endif
! 		);
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1)
*************** test_sync(int writes_per_op)
*** 201,207 ****
  	 */
  #if PG_O_DIRECT != 0
  	if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
! 		printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
  	else
  	{
  		if (writes_per_op == 1)
--- 210,219 ----
  	 */
  #if PG_O_DIRECT != 0
  	if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
! 	{
! 		printf(NA_FORMAT, "o_direct", "n/a**\n");
! 		fs_warning = true;
! 	}
  	else
  	{
  		if (writes_per_op == 1)
*************** test_sync(int writes_per_op)
*** 321,329 ****
   */
  #ifdef OPEN_SYNC_FLAG
  	if (writes_per_op == 1)
! 		printf(LABEL_FORMAT, "open_sync 8k write");
  	else
! 		printf(LABEL_FORMAT, "2 open_sync 8k writes");
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
--- 333,349 ----
   */
  #ifdef OPEN_SYNC_FLAG
  	if (writes_per_op == 1)
! 		printf(LABEL_FORMAT, "open_sync 8k write"
! #if PG_O_DIRECT != 0
! 		"*"
! #endif
! 		);
  	else
! 		printf(LABEL_FORMAT, "2 open_sync 8k writes"
! #if PG_O_DIRECT != 0
! 		"*"
! #endif
! 		);
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
*************** test_sync(int writes_per_op)
*** 352,358 ****
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
! 		printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
  	else
  	{
  		gettimeofday(&start_t, NULL);
--- 372,381 ----
  	fflush(stdout);
  
  	if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
! 	{
! 		printf(NA_FORMAT, "o_direct", "n/a**\n");
! 		fs_warning = true;
! 	}
  	else
  	{
  		gettimeofday(&start_t, NULL);
*************** test_sync(int writes_per_op)
*** 375,380 ****
--- 398,414 ----
  #else
  	printf(NA_FORMAT, "open_sync", "n/a\n");
  #endif
+ 
+ #if defined(OPEN_DATASYNC_FLAG) || defined(OPEN_SYNC_FLAG)
+ 	if (PG_O_DIRECT != 0)
+ 		printf("* This non-direct I/O option is not used by Postgres.\n");
+ #endif
+ 
+ 	if (fs_warning)
+ 	{
+ 		printf("** This file system and its mount options do not support direct\n");
+ 		printf("I/O, e.g. ext4 in journaled mode.\n");
+ 	}
  }
  
  void
*************** test_open_syncs(void)
*** 389,394 ****
--- 423,430 ----
  	printf("(This is designed to compare the cost of one large\n");
  	printf("sync'ed write and two smaller sync'ed writes.)\n");
  
+ 	/* XXX no PG_O_DIRECT */
+ 
  /*
   * Test open_sync with different size files
   */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to