Whamcloud - gitweb
- add command line option to random-reads to make multiple consecutive calls
authornikita <nikita>
Sat, 10 Sep 2005 13:18:11 +0000 (13:18 +0000)
committernikita <nikita>
Sat, 10 Sep 2005 13:18:11 +0000 (13:18 +0000)
   to read(2);

 - add random-reads to the Makefile;

 - add random-reads-based test to sanity.sh (test_101) to test how read-ahead
 algorithm handles seekful work-loads.

lustre/tests/Makefile.am
lustre/tests/random-reads.c
lustre/tests/sanity.sh

index 13911ba..13ae5dc 100644 (file)
@@ -24,7 +24,7 @@ noinst_PROGRAMS += wantedi statone runas openfile getdents o_directory
 noinst_PROGRAMS += small_write multiop sleeptest ll_sparseness_verify cmknod
 noinst_PROGRAMS += ll_sparseness_write mrename ll_dirstripe_verify mkdirmany rmdirmany
 noinst_PROGRAMS += openfilleddirunlink rename_many memhog iopentest1 iopentest2
-noinst_PROGRAMS += mmap_sanity flock_test writemany
+noinst_PROGRAMS += mmap_sanity flock_test writemany random-reads
 if MPITESTS
 noinst_PROGRAMS += parallel_grouplock write_append_truncate createmany_mpi
 endif
index 1070835..27ce5bf 100644 (file)
@@ -38,7 +38,7 @@ static void usage(void)
 {
        printf("random-reads: read random chunks of a file.\n");
        printf("Usage:\n\n");
-       printf("random-reads -f <filename> -s <filesize> -b <buffersize> [-v] [-h] [-C] [-S <seed>] [-n <iterations>] [-w <width>]\n");
+       printf("random-reads -f <filename> -s <filesize> -b <buffersize> -a <adjacent reads> [-v] [-h] [-C] [-S <seed>] [-n <iterations>] [-w <width>]\n");
 }
 
 enum {
@@ -74,6 +74,7 @@ int main(int argc, char **argv)
        char  *fname = NULL;
        loff_t size = 0;
        size_t bsize = 0;
+       int    ad = 1;
        int    preclean = 0;
        int    width = 10;
        unsigned int seed = 0;
@@ -93,7 +94,7 @@ int main(int argc, char **argv)
        char *buf;
 
        do {
-               opt = getopt(argc, argv, "f:s:b:vhCS:n:w:");
+               opt = getopt(argc, argv, "f:s:b:va:hCS:n:w:");
                switch (opt) {
                case -1:
                        break;
@@ -114,6 +115,9 @@ int main(int argc, char **argv)
                case 'b':
                        bsize = atol(optarg);
                        break;
+               case 'a':
+                       ad = atoi(optarg);
+                       break;
                case 'C':
                        preclean = 1;
                        break;
@@ -129,11 +133,12 @@ int main(int argc, char **argv)
                }
        } while (opt != -1);
 
-       if (fname == NULL || size == 0 || bsize == 0) {
+       if (fname == NULL || size == 0 || bsize == 0 || ad <= 0) {
                usage();
                return RR_SET;
        }
 
+       bsize /= ad;
        nblocks = size / bsize;
        buf = malloc(bsize);
        if (buf == NULL) {
@@ -166,16 +171,20 @@ int main(int argc, char **argv)
        gettimeofday(&start, NULL);
        for (i = 0; !iterations || i < iterations; i ++) {
                unsigned long block_nr;
+               int j;
 
                block_nr = (int) ((double)nblocks*rand()/(RAND_MAX+1.0));
                if (i % width == 0)
                        LOG(LOG_INFO, "\n%9lu: ", i);
                LOG(LOG_INFO, "%7lu ", block_nr);
-               ret = pread(fd, buf, bsize, block_nr * bsize);
-               if (ret != bsize) {
-                       LOG(LOG_CRIT, "pread(...%zi, %li) got: %zi, %m\n",
-                           bsize, block_nr * bsize, ret);
-                       return RR_READ;
+               for (j = 0; j < ad; j++) {
+                       ret = pread(fd, buf, bsize, (block_nr + j) * bsize);
+                       if (ret != bsize) {
+                               LOG(LOG_CRIT,
+                                   "pread(...%zi, %li) got: %zi, %m\n",
+                                   bsize, block_nr * bsize, ret);
+                               return RR_READ;
+                       }
                }
        }
        gettimeofday(&stop, NULL);
index edd381c..8d1ed30 100644 (file)
@@ -37,6 +37,7 @@ LCTL=${LCTL:-lctl}
 MCREATE=${MCREATE:-mcreate}
 OPENFILE=${OPENFILE:-openfile}
 OPENUNLINK=${OPENUNLINK:-openunlink}
+RANDOM_READS=${RANDOM_READS:-"random-reads"}
 TOEXCL=${TOEXCL:-toexcl}
 TRUNCATE=${TRUNCATE:-truncate}
 MUNLINK=${MUNLINK:-munlink}
@@ -215,6 +216,7 @@ echo preparing for tests involving mounts
 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
 touch $EXT2_DEV
 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
+echo # add a newline after mke2fs.
 
 umask 077
 
@@ -2663,6 +2665,53 @@ test_100() {
 }
 run_test 100 "check local port using privileged port ==========="
 
+function get_named_value()
+{
+    local tag
+
+    tag=$1
+    while read ;do
+        line=$REPLY
+        case $line in
+        $tag*)
+            echo $line | sed "s/^$tag//"
+            break
+            ;;
+        esac
+    done
+}
+
+test_101() {
+    local s
+    local discard
+    local nreads
+
+    for s in $LPROC/osc/OSC_*/rpc_stats ;do
+        echo 0 > $s
+    done
+    for s in $LPROC/llite/*/read_ahead_stats ;do
+        echo 0 > $s
+    done
+
+    #
+    # randomly read 10000 of 64K chunks from 200M file.
+    #
+    nreads=10000
+       $RANDOM_READS -f /mnt/lustre/room101.area -s200000000 -b65536 -C -n$nreads
+
+    discard=0
+    for s in $LPROC/llite/*/read_ahead_stats ;do
+        discard=$(($discard + $(cat $s | get_named_value 'read but discarded')))
+    done
+
+    if [ $(($discard * 10)) -gt $nreads ] ;then
+        cat $LPROC/osc/OSC_*/rpc_stats
+        cat $LPROC/llite/*/read_ahead_stats
+        error "too many ($discard) discarded pages" 
+    fi
+}
+run_test 101 "check read-ahead for random reads ==========="
+
 TMPDIR=$OLDTMPDIR
 TMP=$OLDTMP
 HOME=$OLDHOME