|
|
|
@ -14,6 +14,8 @@ |
|
|
|
|
#include <sys/time.h> |
|
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
|
|
#define FSYNC_FILENAME "/var/tmp/test_fsync.out" |
|
|
|
|
|
|
|
|
|
/* O_SYNC and O_FSYNC are the same */ |
|
|
|
|
#if defined(O_SYNC) |
|
|
|
|
#define OPEN_SYNC_FLAG O_SYNC |
|
|
|
@ -36,12 +38,25 @@ main(int argc, char *argv[]) |
|
|
|
|
struct timeval start_t; |
|
|
|
|
struct timeval elapse_t; |
|
|
|
|
int tmpfile, |
|
|
|
|
i; |
|
|
|
|
i, |
|
|
|
|
loops=1000; |
|
|
|
|
char *strout = (char *) malloc(65536); |
|
|
|
|
char *filename = FSYNC_FILENAME; |
|
|
|
|
|
|
|
|
|
if (argc > 2 && strcmp(argv[1],"-f") == 0) |
|
|
|
|
{ |
|
|
|
|
filename = argv[2]; |
|
|
|
|
argv += 2; |
|
|
|
|
argc -= 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (argc > 1) |
|
|
|
|
loops = atoi(argv[1]); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < 65536; i++) |
|
|
|
|
strout[i] = 'a'; |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1) |
|
|
|
|
|
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 65536); |
|
|
|
|
fsync(tmpfile); /* fsync so later fsync's don't have to do
|
|
|
|
@ -51,24 +66,35 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("Simple write timing:\n"); |
|
|
|
|
/* write only */ |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
close(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
close(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
printf("\twrite "); |
|
|
|
|
print_elapse(start_t, elapse_t); |
|
|
|
|
printf("\n\n"); |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
printf("Compare fsync before and after write's close:\n"); |
|
|
|
|
printf("\nCompare fsync times on write() and non-write() descriptor:\n"); |
|
|
|
|
printf("(If the times are similar, fsync() can sync data written\n on a different descriptor.)\n"); |
|
|
|
|
|
|
|
|
|
/* write, fsync, close */ |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
close(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
close(tmpfile); |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
/* do nothing but the open/close the tests are consistent. */ |
|
|
|
|
close(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
printf("\twrite, fsync, close "); |
|
|
|
|
print_elapse(start_t, elapse_t); |
|
|
|
@ -76,15 +102,18 @@ main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
/* write, close, fsync */ |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
close(tmpfile); |
|
|
|
|
/* reopen file */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
close(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
close(tmpfile); |
|
|
|
|
/* reopen file */ |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
close(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
printf("\twrite, close, fsync "); |
|
|
|
|
print_elapse(start_t, elapse_t); |
|
|
|
@ -93,10 +122,11 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\nCompare one o_sync write to two:\n"); |
|
|
|
|
|
|
|
|
|
/* 16k o_sync write */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 16384); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
write(tmpfile, strout, 16384); |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\tone 16k o_sync write "); |
|
|
|
@ -104,11 +134,14 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
/* 2*8k o_sync writes */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\ttwo 8k o_sync writes "); |
|
|
|
@ -119,10 +152,11 @@ main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
#ifdef OPEN_DATASYNC_FLAG |
|
|
|
|
/* open_dsync, write */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_DSYNC)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_DSYNC)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\topen o_dsync, write "); |
|
|
|
@ -133,10 +167,11 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
/* open_fsync, write */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\topen o_sync, write "); |
|
|
|
@ -145,11 +180,14 @@ main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_FDATASYNC |
|
|
|
|
/* write, fdatasync */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fdatasync(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fdatasync(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\twrite, fdatasync "); |
|
|
|
@ -160,11 +198,14 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
/* write, fsync, close */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\twrite, fsync, "); |
|
|
|
@ -176,11 +217,14 @@ main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
#ifdef OPEN_DATASYNC_FLAG |
|
|
|
|
/* open_dsync, write */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_DSYNC)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_DSYNC)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\topen o_dsync, write "); |
|
|
|
@ -191,11 +235,14 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
/* open_fsync, write */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\topen o_sync, write "); |
|
|
|
@ -204,12 +251,15 @@ main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_FDATASYNC |
|
|
|
|
/* write, fdatasync */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fdatasync(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fdatasync(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\twrite, fdatasync "); |
|
|
|
@ -220,19 +270,22 @@ main(int argc, char *argv[]) |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
/* write, fsync, close */ |
|
|
|
|
if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1) |
|
|
|
|
if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1) |
|
|
|
|
die("can't open /var/tmp/test_fsync.out"); |
|
|
|
|
gettimeofday(&start_t, NULL); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
for (i = 0; i < loops; i++) |
|
|
|
|
{ |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
write(tmpfile, strout, 8192); |
|
|
|
|
fsync(tmpfile); |
|
|
|
|
} |
|
|
|
|
gettimeofday(&elapse_t, NULL); |
|
|
|
|
close(tmpfile); |
|
|
|
|
printf("\twrite, fsync, "); |
|
|
|
|
print_elapse(start_t, elapse_t); |
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
unlink("/var/tmp/test_fsync.out"); |
|
|
|
|
unlink(FSYNC_FILENAME); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -246,7 +299,7 @@ print_elapse(struct timeval start_t, struct timeval elapse_t) |
|
|
|
|
elapse_t.tv_usec += 1000000; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
printf("%ld.%06ld", (long) (elapse_t.tv_sec - start_t.tv_sec), |
|
|
|
|
printf("%3ld.%06ld", (long) (elapse_t.tv_sec - start_t.tv_sec), |
|
|
|
|
(long) (elapse_t.tv_usec - start_t.tv_usec)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|