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