github.com/yandex-cloud/geesefs@v0.40.9/bench/bench.sh (about)

     1  #!/bin/bash
     2  
     3  FAST=$FAST
     4  test=$test
     5  CLEANUP=${CLEANUP:-true}
     6  
     7  iter=10
     8  if [ "$FAST" != "" ]; then
     9      iter=1
    10  fi
    11  
    12  set -o errexit
    13  set -o nounset
    14  
    15  if [ $# -lt 1 ]; then
    16      echo "Usage: $0 <dir> [test name]"
    17      exit 1
    18  fi
    19  
    20  mnt=$1
    21  if [ $# -gt 1 ]; then
    22      t=$2
    23  else
    24      t=
    25  fi
    26  
    27  prefix=$mnt/test_dir
    28  
    29  function wait_for_mount {
    30      for i in $(seq 1 10); do
    31          if grep -q $mnt /proc/mounts; then
    32              break
    33          fi
    34          sleep 1
    35      done
    36      if ! grep -q $mnt /proc/mounts; then
    37          echo "$mnt not mounted"
    38          exit 1
    39      fi
    40  }
    41  
    42  mkdir -p "$prefix"
    43  cd "$prefix"
    44  
    45  export TIMEFORMAT=%R
    46  
    47  function fsync_dir {
    48      python3 -c "import sys, os; os.fsync(os.open('.', os.O_RDONLY))"
    49  }
    50  
    51  function run_test {
    52      test=$1
    53      shift
    54      sleep 2
    55      echo -n "$test "
    56      time $test $@
    57  }
    58  
    59  function get_howmany {
    60      if [ $# -ge 1 ]; then
    61          howmany=$1
    62      else
    63          howmany=100
    64      fi
    65  }
    66  
    67  function create_files {
    68      get_howmany $@
    69  
    70      for i in $(seq 1 $howmany); do
    71          echo $i > file$i
    72      done
    73      fsync_dir
    74  }
    75  
    76  function ls_files {
    77      get_howmany $@
    78      # people usually use ls in the terminal when color is on
    79      numfiles=$(ls -1 --color=always | wc -l)
    80      if [ "$numfiles" -ne "$howmany" ]; then
    81          echo "$numfiles != $howmany"
    82          false
    83      fi
    84  }
    85  
    86  function rm_files {
    87      get_howmany $@
    88  
    89      for i in $(seq 1 $howmany); do
    90          rm file$i >&/dev/null || true
    91      done
    92      fsync_dir
    93  }
    94  
    95  function find_files {
    96      numfiles=$(find . | wc -l)
    97  
    98      if [ "$numfiles" -ne 820 ]; then
    99          echo "$numfiles != 820"
   100          rm_tree
   101          exit 1
   102      fi
   103  }
   104  
   105  function create_tree_parallel {
   106      (for i in $(seq 1 9); do
   107          mkdir $i
   108          for j in $(seq 1 9); do
   109              mkdir $i/$j
   110  
   111              for k in $(seq 1 9); do
   112                   touch $i/$j/$k & true
   113               done
   114           done
   115      done
   116      wait)
   117      fsync_dir
   118  }
   119  
   120  function rm_tree {
   121      for i in $(seq 1 9); do
   122          rm -Rf $i
   123      done
   124      fsync_dir
   125  }
   126  
   127  function create_files_parallel {
   128      get_howmany $@
   129  
   130      (for i in $(seq 1 $howmany); do
   131          echo $i > file$i & true
   132      done
   133      wait)
   134      fsync_dir
   135  }
   136  
   137  function rm_files_parallel {
   138      get_howmany $@
   139  
   140      (for i in $(seq 1 $howmany); do
   141          rm file$i & true
   142      done
   143      wait)
   144      fsync_dir
   145  }
   146  
   147  function write_large_file {
   148      count=1000
   149      if [ "$FAST" == "true" ]; then
   150          count=100
   151      fi
   152      dd if=/dev/zero of=largefile bs=1MB count=$count oflag=direct
   153      fsync_dir
   154  }
   155  
   156  function read_large_file {
   157      dd if=largefile of=/dev/null bs=1MB iflag=direct
   158  }
   159  
   160  function read_first_byte {
   161      dd if=largefile of=/dev/null bs=512 count=1 iflag=direct
   162  }
   163  
   164  if [ "$t" = "" -o "$t" = "create" ]; then
   165      for i in $(seq 1 $iter); do
   166          run_test create_files
   167          run_test rm_files
   168      done
   169  fi
   170  
   171  if [ "$t" = "" -o "$t" = "create_parallel" ]; then
   172      for i in $(seq 1 $iter); do
   173          run_test create_files_parallel
   174          run_test rm_files_parallel
   175      done
   176  fi
   177  
   178  function write_md5 {
   179      if ! base64 -w 0 </dev/null; then
   180          # BSD base64
   181          seed=$(dd if=/dev/urandom bs=128 count=1 | base64)
   182      else
   183          seed=$(dd if=/dev/urandom bs=128 count=1 | base64 -w 0)
   184      fi
   185      random_cmd="openssl enc -aes-256-ctr -pass pass:$seed -nosalt"
   186      count=1000
   187      if [ "$FAST" == "true" ]; then
   188          count=100
   189      fi
   190      MD5=$(dd if=/dev/zero bs=1M count=$count | $random_cmd | \
   191          tee >(md5sum) >(dd of=largefile bs=1M oflag=direct) >/dev/null | cut -f 1 '-d ')
   192      fsync_dir
   193  }
   194  
   195  function read_md5 {
   196      READ_MD5=$(md5sum largefile | cut -f 1 '-d ')
   197      if [ "$READ_MD5" != "$MD5" ]; then
   198          echo "$READ_MD5 != $MD5" >&2
   199          exit 1
   200      fi
   201  }
   202  
   203  if [ "$t" = "" -o "$t" = "io" ]; then
   204      for i in $(seq 1 $iter); do
   205          run_test write_md5
   206          run_test read_md5
   207          run_test read_first_byte
   208          rm largefile
   209      done
   210  fi
   211  
   212  if [ "$t" = "" -o "$t" = "ls" ]; then
   213      rm -rf bench_ls
   214      mkdir bench_ls
   215      cd bench_ls
   216      create_files_parallel 2000
   217      for i in $(seq 1 $iter); do
   218          run_test ls_files 2000
   219      done
   220      if [ "$CLEANUP" = "true" ]; then
   221          rm_files 2000
   222      fi
   223      cd ..
   224  fi
   225  
   226  if [ "$t" = "ls_create" ]; then
   227      create_files_parallel 1000
   228      test=dummy
   229      sleep 10
   230  fi
   231  
   232  if [ "$t" = "ls_ls" ]; then
   233      run_test ls_files 1000
   234  fi
   235  
   236  if [ "$t" = "ls_rm" ]; then
   237      rm_files 1000
   238      test=dummy
   239  fi
   240  
   241  if [ "$t" = "" -o "$t" = "find" ]; then
   242      rm -rf bench_find
   243      mkdir bench_find
   244      cd bench_find
   245      create_tree_parallel
   246      for i in $(seq 1 $iter); do
   247          run_test find_files
   248      done
   249      rm_tree
   250      cd ..
   251  fi
   252  
   253  if [ "$t" = "find_create" ]; then
   254      create_tree_parallel
   255      test=dummy
   256      sleep 10
   257  fi
   258  
   259  if [ "$t" = "find_find" ]; then
   260      for i in $(seq 1 $iter); do
   261          run_test find_files
   262      done
   263  fi
   264  
   265  if [ "$t" = "issue231" ]; then
   266      run_test write_md5
   267      (for i in $(seq 1 20); do
   268           run_test read_md5 & true
   269      done; wait);
   270      rm largefile
   271  fi
   272  
   273  
   274  if [ "$t" = "cleanup" ]; then
   275      rm -Rf *
   276      test=dummy
   277  fi
   278  
   279  # for https://github.com/kahing/goofys/issues/64
   280  # quote: There are 5 concurrent transfers going at a time.
   281  # Data file size is often 100-400MB.
   282  # Regarding the number of transfers, I think it's about 200 files.
   283  # We read from the goofys mounted s3 bucket and write to a local spring webapp using curl.
   284  if [ "$t" = "disable" -o "$t" = "issue64" ]; then
   285      # setup the files
   286      (for i in $(seq 0 9); do
   287          dd if=/dev/zero of=file$i bs=1MB count=300 oflag=direct & true
   288      done
   289      wait)
   290      if [ $? != 0 ]; then
   291          exit $?
   292      fi
   293  
   294      # 200 files and 5 concurrent transfer means 40 times, do 50 times for good measure
   295      (for i in $(seq 0 9); do
   296          dd if=file$i of=/dev/null bs=1MB iflag=direct &
   297      done
   298  
   299      for i in $(seq 10 300); do
   300          # wait for 1 to finish, then invoke more
   301          wait -n
   302          running=$(ps -ef | grep ' dd if=' | grep -v grep | sed 's/.*dd if=file\([0-9]\).*/\1/')
   303          for i in $(seq 0 9); do
   304              if echo $running | grep -v -q $i; then
   305                  dd if=file$i of=/dev/null bs=1MB iflag=direct &
   306                  break
   307              fi
   308          done
   309      done
   310      wait)
   311      if [ $? != 0 ]; then
   312          exit $?
   313      fi
   314  
   315      # cleanup
   316      (for i in $(seq 0 9); do
   317          rm -f file$i & true
   318      done
   319      wait)
   320  fi
   321  
   322  if [ "$test" = "" ]; then
   323      echo "No test was run: $t"
   324      exit 1
   325  fi