Browse Source

Better directory mode in seqreader

Suren A. Chilingaryan 11 years ago
parent
commit
5df9c1947b
1 changed files with 55 additions and 22 deletions
  1. 55 22
      fsbench.sh

+ 55 - 22
fsbench.sh

@@ -18,6 +18,7 @@
 
 #define SYNC_MODE
 #define AIO_MODE 2
+//#define FS_SYNC_MODE
 #define EXTRA_BUFFERS 2
 #define WRITE_INTERVAL 1
 
@@ -38,7 +39,7 @@
 #ifdef AIO_MODE
 # define BUFSIZE (BLOCK_SIZE * (AIO_MODE + EXTRA_BUFFERS))
 #else /* AIO_MODE */
-# define BUFSIZE BLOCK_SIZE
+# define BUFSIZE (1024 * RAID_STRIP_SIZE * RAID_DISKS) 
 #endif /* AIO_MODE */
 
 
@@ -47,7 +48,7 @@ int main(int argc, char *argv[]) {
     size_t SKIP = 1;
     DIR *dir;
     struct dirent *ent;
-    struct timeval start, tv;
+    struct timeval start, fstart, tv;
     size_t us;
     size_t files = 0;
     size_t total_size = 0;
@@ -58,7 +59,7 @@ int main(int argc, char *argv[]) {
     size_t ready;
     ssize_t res;
     size_t max_size = (size_t)-1;
-    char *buffer;//[BUFSIZE];
+    char *buffer;
     long double mcoef = 1000000. / (1024 * 1024);
     int flags = O_RDONLY|O_NOATIME|O_LARGEFILE;
 
@@ -74,11 +75,6 @@ int main(int argc, char *argv[]) {
     struct io_event ev[AIO_MODE];
 #endif /* AIO_MODE */
 
-#ifdef SYNC_MODE
-    flags |= O_DIRECT;
-#endif
-
-    printf("Used buffer: %i MB, Block: %i KB\n", BUFSIZE / 1024 / 1024, BLOCK_SIZE/1024);
 
     posix_memalign((void**)&buffer, FASTWRITER_SYNCIO_ALIGN, BUFSIZE);
     
@@ -93,6 +89,13 @@ int main(int argc, char *argv[]) {
 	    max_size *= 1024 * 1024 * 1024;
 	}
 
+#ifdef SYNC_MODE
+	flags |= O_DIRECT;
+#endif
+	
+	printf("Used buffer: %i MB, Block: %i KB\n", BUFSIZE / 1024 / 1024, BLOCK_SIZE/1024);
+
+
 	int fd = open(argv[1], flags, 0);
 	if (fd < 0) {
 	    printf("Unable to open device %s\n", argv[1]);
@@ -219,6 +222,10 @@ int main(int argc, char *argv[]) {
 	return 0;
     }
 
+#ifdef FS_SYNC_MODE
+    flags |= O_DIRECT;
+#endif /* FS_SYNC_MODE */
+	
     chdir(argv[1]);
 
     if (argc > 2) {
@@ -239,38 +246,55 @@ int main(int argc, char *argv[]) {
 	if (stat(ent->d_name, &st)) continue;
 	if (!S_ISREG(st.st_mode)) continue;
 
+	int size = st.st_blksize;
+
 #ifdef F_MODE
 	FILE *f = fopen(ent->d_name, "r");
 	if (!f) continue;
 #else	
 	int fd = open(ent->d_name, flags, 0);
 	if (fd < 0) continue;
+
+# ifdef FS_SYNC_MODE
+	if (size < BLOCK_SIZE) size = BLOCK_SIZE;
+# endif /* FS_SYNC_MODE */
 #endif	
-	
-	int size = st.st_blksize;
+
+	if (!files)
+    	    printf("Reading %s, Block: %i KB\n", ent->d_name, size / 1024);
 	
 	if (size > BUFSIZE) {
 	    printf("Buffer too small\n");
 	    exit(1);
 	}
 
+	size_t last_file_write = 0;
+	size_t last_file_size = 0;
+	size_t file_size = 0;
+        gettimeofday(&fstart, NULL);
 
 #ifdef F_MODE
 	while (!feof(f)) {
-	    err = fread(buffer, 1, size, f);
-	    if (err < 0) break;
-	}
+	    ssize_t ret = fread(buffer, 1, size, f);
 #else
-# ifdef SYNC_MODE
-	if (size < BLOCK_SIZE) size = BLOCK_SIZE;
-# endif
-        err = read(fd, buffer, size);
-        while (err > 0) {
-	    err = read(fd, buffer, size);
-	}
+        while (1) {
+	    ssize_t ret = read(fd, buffer, size);
 #endif
+	    if (ret <= 0) break;
+	    
+	    file_size += ret;
 
-	if (err < 0) {
+	    gettimeofday(&tv, NULL);
+	    us = (tv.tv_sec - fstart.tv_sec) * 1000000 + (tv.tv_usec - fstart.tv_usec);
+
+	    if ((us - last_file_write) > WRITE_INTERVAL * 1000000) {
+		printf("Reading: %s (%lu GB),  Measured speed: %zu MB/s, Current speed: %zu MB/s\n", ent->d_name, file_size / 1024 / 1024 / 1024, (size_t)(mcoef * file_size / us), (size_t)(mcoef * (file_size - last_file_size) / (us - last_file_write)));
+		last_file_write = us;
+		last_file_size = file_size;
+	    }
+	}
+
+	if (!file_size) {
 	    printf("Read failed\n");
 	    exit(1);
 	}
@@ -286,9 +310,18 @@ int main(int argc, char *argv[]) {
 	
 	gettimeofday(&tv, NULL);
 	us = (tv.tv_sec - start.tv_sec) * 1000000 + (tv.tv_usec - start.tv_usec);
-	printf("Reading: %s (%lu MB), Read: %lu files (%lu GB),  Measured speed: %zu MB/s\n", ent->d_name, st.st_size/1024/1024, files, total_size / 1024 / 1024 / 1024, (size_t)(mcoef * total_size / us));
+	if ((us - last_write) > WRITE_INTERVAL * 1000000) {
+	    last_write = us;
+	    printf("Read: %lu files (%lu GB) at %zu MB/s", files, total_size / 1024 / 1024 / 1024, (size_t)(mcoef * total_size / us));
+
+	    us = (tv.tv_sec - fstart.tv_sec) * 1000000 + (tv.tv_usec - fstart.tv_usec);
+	    printf(", Last: %s (%lu MB) at %zu MB/s\n", ent->d_name, st.st_size/1024/1024, (size_t)(mcoef * file_size / us));
+	}
       }
       closedir(dir);
+
+      us = (tv.tv_sec - start.tv_sec) * 1000000 + (tv.tv_usec - start.tv_usec);
+      printf("Total: %lu files (%lu GB) at %zu MB/s\n", files, total_size / 1024 / 1024 / 1024, (size_t)(mcoef * total_size / us));
     }
     
     free(buffer);