OSDN Git Service

test_fsync:
authorBruce Momjian <bruce@momjian.us>
Sat, 28 Nov 2009 15:04:54 +0000 (15:04 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 28 Nov 2009 15:04:54 +0000 (15:04 +0000)
Improve test descriptions displayed during test_fsync;  increase default
loops to 5k.

src/tools/fsync/README
src/tools/fsync/test_fsync.c

index d33e390..0ab84b1 100644 (file)
@@ -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.
index 52351b7..f63f4fb 100644 (file)
@@ -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
 #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