/*
- * $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;
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);
/*
* 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 */
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 */
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 */
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)
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);
}
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