aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/fsync/README4
-rw-r--r--src/tools/fsync/test_fsync.c302
2 files changed, 148 insertions, 158 deletions
diff --git a/src/tools/fsync/README b/src/tools/fsync/README
index d33e390f490..0ab84b1ef0f 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 52351b7dfdd..f63f4fb2061 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