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 d33e390f4900af86487d87d6a9d1320242b94e7b..0ab84b1ef0faec007056f82385a1e412668daed6 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 52351b7dfdd301adabd82a27e1dc8d8b5aae1fcb..f63f4fb20617bd293d6add37b1c7d84f311b62a5 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