From: Bruce Momjian Date: Sat, 28 Nov 2009 15:04:54 +0000 (+0000) Subject: test_fsync: X-Git-Tag: REL9_0_0~1396 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=017c47bf51f47b61df04ef563bab0424e9975858;p=pg-rex%2Fsyncrep.git test_fsync: Improve test descriptions displayed during test_fsync; increase default loops to 5k. --- diff --git a/src/tools/fsync/README b/src/tools/fsync/README index d33e390f49..0ab84b1ef0 100644 --- a/src/tools/fsync/README +++ b/src/tools/fsync/README @@ -1,4 +1,4 @@ -$PostgreSQL: pgsql/src/tools/fsync/README,v 1.4 2008/03/21 13:23:29 momjian Exp $ +$PostgreSQL: pgsql/src/tools/fsync/README,v 1.5 2009/11/28 15:04:54 momjian Exp $ fsync ===== @@ -7,5 +7,5 @@ This program tests fsync. The tests are described as part of the program output Usage: test_fsync [-f filename] [loops] -Loops defaults to 1000. The default output file is /var/tmp/test_fsync.out. +Loops defaults to 5000. The default output file is /var/tmp/test_fsync.out. Consider that /tmp or /var/tmp might be memory-based file systems. diff --git a/src/tools/fsync/test_fsync.c b/src/tools/fsync/test_fsync.c index 52351b7dfd..f63f4fb206 100644 --- a/src/tools/fsync/test_fsync.c +++ b/src/tools/fsync/test_fsync.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/src/tools/fsync/test_fsync.c,v 1.25 2009/09/21 20:20:56 momjian Exp $ + * $PostgreSQL: pgsql/src/tools/fsync/test_fsync.c,v 1.26 2009/11/28 15:04:54 momjian Exp $ * * * test_fsync.c @@ -30,19 +30,21 @@ #define FSYNC_FILENAME "/var/tmp/test_fsync.out" #endif -#define WRITE_SIZE (16 * 1024) /* 16k */ +#define WRITE_SIZE (8 * 1024) /* 8k */ + +#define LABEL_FORMAT "\t%-30s" void die(char *str); -void print_elapse(struct timeval start_t, struct timeval elapse_t); +void print_elapse(struct timeval start_t, struct timeval stop_t); int main(int argc, char *argv[]) { struct timeval start_t; - struct timeval elapse_t; + struct timeval stop_t; int tmpfile, i, - loops = 1000; + loops = 5000; char *full_buf = (char *) malloc(XLOG_SEG_SIZE), *buf; char *filename = FSYNC_FILENAME; @@ -58,13 +60,13 @@ main(int argc, char *argv[]) loops = atoi(argv[1]); for (i = 0; i < XLOG_SEG_SIZE; i++) - full_buf[i] = 'a'; + full_buf[i] = random(); if ((tmpfile = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR, 0)) == -1) die("Cannot open output file."); if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE) die("write failed"); - /* fsync so later fsync's don't have to do it */ + /* fsync now so later fsync's don't have to do it */ if (fsync(tmpfile) != 0) die("fsync failed"); close(tmpfile); @@ -74,119 +76,109 @@ main(int argc, char *argv[]) /* * Simple write */ - printf("Simple write timing:\n"); + printf("Simple 8k write timing:\n"); /* write only */ gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { if ((tmpfile = open(filename, O_RDWR, 0)) == -1) die("Cannot open output file."); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); close(tmpfile); } - gettimeofday(&elapse_t, NULL); - printf("\twrite "); - print_elapse(start_t, elapse_t); - printf("\n"); + gettimeofday(&stop_t, NULL); + printf(LABEL_FORMAT, "write"); + print_elapse(start_t, stop_t); /* - * Fsync another file descriptor? + * Compare file sync methods with one 8k write */ - printf("\nCompare fsync times on write() and non-write() descriptor:\n"); - printf("If the times are similar, fsync() can sync data written\non a different descriptor.\n"); + printf("\nCompare file sync methods using one 8k write:\n"); - /* write, fsync, close */ +#ifdef OPEN_DATASYNC_FLAG + /* open_dsync, write */ + if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1) + die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); - if (fsync(tmpfile) != 0) - die("fsync failed"); - close(tmpfile); - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); - /* do nothing but the open/close the tests are consistent. */ - close(tmpfile); + if (lseek(tmpfile, 0, SEEK_SET) == -1) + die("seek failed"); } - gettimeofday(&elapse_t, NULL); - printf("\twrite, fsync, close "); - print_elapse(start_t, elapse_t); - printf("\n"); + gettimeofday(&stop_t, NULL); + close(tmpfile); + printf(LABEL_FORMAT, "open_datasync write"); + print_elapse(start_t, stop_t); +#else + printf("\t(open_datasync unavailable)\n"); +#endif - /* write, close, fsync */ +#ifdef OPEN_SYNC_FLAG + /* open_fsync, write */ + if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1) + die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); - close(tmpfile); - /* reopen file */ - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); - if (fsync(tmpfile) != 0) - die("fsync failed"); - close(tmpfile); + if (lseek(tmpfile, 0, SEEK_SET) == -1) + die("seek failed"); } - gettimeofday(&elapse_t, NULL); - printf("\twrite, close, fsync "); - print_elapse(start_t, elapse_t); - printf("\n"); - - /* - * Compare 1 to 2 writes - */ - printf("\nCompare one o_sync write to two:\n"); + gettimeofday(&stop_t, NULL); + close(tmpfile); + printf(LABEL_FORMAT, "open_sync write"); + print_elapse(start_t, stop_t); +#else + printf("\t(open_sync unavailable)\n"); +#endif -#ifdef OPEN_SYNC_FLAG - /* 16k o_sync write */ - if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1) +#ifdef HAVE_FDATASYNC + /* write, fdatasync */ + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); + fdatasync(tmpfile); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\tone 16k o_sync write "); - print_elapse(start_t, elapse_t); - printf("\n"); + printf(LABEL_FORMAT, "write, fdatasync"); + print_elapse(start_t, stop_t); +#else + printf("\t(fdatasync unavailable)\n"); +#endif - /* Two 8k o_sync writes */ - if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1) + /* write, fsync, close */ + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) - die("write failed"); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); + if (fsync(tmpfile) != 0) + die("fsync failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\ttwo 8k o_sync writes "); - print_elapse(start_t, elapse_t); -#else - printf("\t(o_sync unavailable) "); -#endif - printf("\n"); + printf(LABEL_FORMAT, "write, fsync"); + print_elapse(start_t, stop_t); /* - * Compare file sync methods with one 8k write + * Compare file sync methods with two 8k write */ - printf("\nCompare file sync methods with one 8k write:\n"); + printf("\nCompare file sync methods using two 8k writes:\n"); #ifdef OPEN_DATASYNC_FLAG /* open_dsync, write */ @@ -195,19 +187,20 @@ main(int argc, char *argv[]) gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) + die("write failed"); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\topen o_dsync, write "); - print_elapse(start_t, elapse_t); + printf(LABEL_FORMAT, "open_datasync write, write"); + print_elapse(start_t, stop_t); #else - printf("\t(o_dsync unavailable) "); + printf("\t(open_datasync unavailable)\n"); #endif - printf("\n"); #ifdef OPEN_SYNC_FLAG /* open_fsync, write */ @@ -216,19 +209,18 @@ main(int argc, char *argv[]) gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) + die("write failed"); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\topen o_sync, write "); - print_elapse(start_t, elapse_t); -#else - printf("\t(o_sync unavailable) "); + printf(LABEL_FORMAT, "open_sync write, write"); + print_elapse(start_t, stop_t); #endif - printf("\n"); #ifdef HAVE_FDATASYNC /* write, fdatasync */ @@ -237,20 +229,21 @@ main(int argc, char *argv[]) gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) + die("write failed"); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); fdatasync(tmpfile); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\twrite, fdatasync "); - print_elapse(start_t, elapse_t); + printf(LABEL_FORMAT, "write, write, fdatasync"); + print_elapse(start_t, stop_t); #else - printf("\t(fdatasync unavailable)"); + printf("\t(fdatasync unavailable)\n"); #endif - printf("\n"); /* write, fsync, close */ if ((tmpfile = open(filename, O_RDWR, 0)) == -1) @@ -258,113 +251,110 @@ main(int argc, char *argv[]) gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) + die("write failed"); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); if (fsync(tmpfile) != 0) die("fsync failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\twrite, fsync "); - print_elapse(start_t, elapse_t); - printf("\n"); + printf(LABEL_FORMAT, "write, write, fsync"); + print_elapse(start_t, stop_t); /* - * Compare file sync methods with two 8k write + * Compare 1 to 2 writes */ - printf("\nCompare file sync methods with two 8k writes:\n"); + printf("\nCompare open_sync sizes:\n"); -#ifdef OPEN_DATASYNC_FLAG - /* open_dsync, write */ - if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1) +#ifdef OPEN_SYNC_FLAG + /* 16k open_sync write */ + if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1) die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) - die("write failed"); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE * 2) != WRITE_SIZE * 2) die("write failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\topen o_dsync, write "); - print_elapse(start_t, elapse_t); -#else - printf("\t(o_dsync unavailable) "); -#endif - printf("\n"); + printf(LABEL_FORMAT, "16k open_sync write"); + print_elapse(start_t, stop_t); -#ifdef OPEN_SYNC_FLAG - /* open_fsync, write */ + /* Two 8k open_sync writes */ if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1) die("Cannot open output file."); gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); if (lseek(tmpfile, 0, SEEK_SET) == -1) die("seek failed"); } - gettimeofday(&elapse_t, NULL); + gettimeofday(&stop_t, NULL); close(tmpfile); - printf("\topen o_sync, write "); - print_elapse(start_t, elapse_t); - printf("\n"); + printf(LABEL_FORMAT, "2 8k open_sync writes"); + print_elapse(start_t, stop_t); +#else + printf("\t(open_sync unavailable)\n"); #endif -#ifdef HAVE_FDATASYNC - /* write, fdatasync */ - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); + /* + * Fsync another file descriptor? + */ + printf("\nCompare fsync times on write() and new file descriptors (if the times\n"); + printf("are similar, fsync() can sync data written on a different descriptor):\n"); + + /* write, fsync, close */ gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) - die("write failed"); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) + die("Cannot open output file."); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); - fdatasync(tmpfile); - if (lseek(tmpfile, 0, SEEK_SET) == -1) - die("seek failed"); + if (fsync(tmpfile) != 0) + die("fsync failed"); + close(tmpfile); + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) + die("Cannot open output file."); + /* do nothing but the open/close the tests are consistent. */ + close(tmpfile); } - gettimeofday(&elapse_t, NULL); - close(tmpfile); - printf("\twrite, fdatasync "); - print_elapse(start_t, elapse_t); -#else - printf("\t(fdatasync unavailable)"); -#endif - printf("\n"); + gettimeofday(&stop_t, NULL); + printf(LABEL_FORMAT, "write, fsync, close"); + print_elapse(start_t, stop_t); - /* write, fsync, close */ - if ((tmpfile = open(filename, O_RDWR, 0)) == -1) - die("Cannot open output file."); + /* write, close, fsync */ gettimeofday(&start_t, NULL); for (i = 0; i < loops; i++) { - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) - die("write failed"); - if (write(tmpfile, buf, WRITE_SIZE / 2) != WRITE_SIZE / 2) + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) + die("Cannot open output file."); + if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE) die("write failed"); + close(tmpfile); + /* reopen file */ + if ((tmpfile = open(filename, O_RDWR, 0)) == -1) + die("Cannot open output file."); if (fsync(tmpfile) != 0) die("fsync failed"); - if (lseek(tmpfile, 0, SEEK_SET) == -1) - die("seek failed"); + close(tmpfile); } - gettimeofday(&elapse_t, NULL); - close(tmpfile); - printf("\twrite, fsync "); - print_elapse(start_t, elapse_t); - printf("\n"); + gettimeofday(&stop_t, NULL); + printf(LABEL_FORMAT, "write, close, fsync"); + print_elapse(start_t, stop_t); + /* cleanup */ free(full_buf); unlink(filename); @@ -372,16 +362,16 @@ main(int argc, char *argv[]) } void -print_elapse(struct timeval start_t, struct timeval elapse_t) +print_elapse(struct timeval start_t, struct timeval stop_t) { - if (elapse_t.tv_usec < start_t.tv_usec) + if (stop_t.tv_usec < start_t.tv_usec) { - elapse_t.tv_sec--; - elapse_t.tv_usec += 1000000; + stop_t.tv_sec--; + stop_t.tv_usec += 1000000; } - printf("%3ld.%06ld", (long) (elapse_t.tv_sec - start_t.tv_sec), - (long) (elapse_t.tv_usec - start_t.tv_usec)); + printf("%3ld.%06ld\n", (long) (stop_t.tv_sec - start_t.tv_sec), + (long) (stop_t.tv_usec - start_t.tv_usec)); } void