| #!/bin/bash | |
| if [ $# -lt 2 ]; then | |
| echo "usage:$0 dev output_dir [iodepth]" | |
| echo "example 1: Testing the whole block device. Attention: That will destory the filesystem on the target block device" | |
| echo "./run_fio.sh /dev/sdb fio_test" | |
| echo "" | |
| echo "example 2: Testing a file, but not destory filesystem. Suppose the target device mount on /data" | |
| echo "fallocate -l 1G /data/test.dat" | |
| echo "./run_fio.sh /data/test.dat fio_test" | |
| echo "" | |
| echo "Finally, it will genarate a certain result into the output_dir, like 'fio_test/fio_test.result" | |
| exit 1 | |
| fi | |
| DEV="$1" | |
| OUTDIR="$2" | |
| if [ ! -d $OUTDIR ]; then | |
| mkdir -p $OUTDIR | |
| fi | |
| # default iodepth=8 | |
| IODEPTH=8 | |
| if [ $# -ge 3 ]; then | |
| if [ $3 -gt 0 ]; then | |
| IODEPTH=$3 | |
| fi | |
| fi | |
| echo "IODEPTH=$IODEPTH" | |
| RUNTIME=30 | |
| BLOCK_SIZES=(512 4K 8K 16K 64K 128K 256K 512K) | |
| JOBS=(write randwrite read randread randrw) | |
| # if you test randrw, you need to specify the rwmixreads in this array | |
| RWMIXREADS=(50 30) | |
| gen_job_file() | |
| { | |
| # gen_job_file job block_size [rwmixread] | |
| job=$1 | |
| block_size=$2 | |
| echo "[global]" > $job | |
| echo "bs=$block_size" >> $job | |
| echo "direct=1" >> $job | |
| echo "rw=$job" >> $job | |
| echo "ioengine=libaio" >> $job | |
| echo "iodepth=$IODEPTH" >> $job | |
| echo "runtime=$RUNTIME" >> $job | |
| if [ "$job" == "randwrite" -o "$job" == "randread" -o "$job" == "randrw" ]; then | |
| echo "randrepeat=0" >> $job | |
| fi | |
| echo "[test]" >> $job | |
| echo "filename=$DEV" >> $job | |
| if [ "$job" == "randrw" ]; then | |
| echo "rwmixread=$3" >> $job | |
| fi | |
| } | |
| cleanup() | |
| { | |
| for job in "${JOBS[@]}" | |
| do | |
| rm -f $job | |
| done | |
| rm -f *.tmp | |
| } | |
| run_test() | |
| { | |
| job=$1 | |
| block_size=$2 | |
| if [ $# -lt 3 ]; then | |
| output="$OUTDIR/fio.$job.$block_size.1.log" | |
| else | |
| output="$OUTDIR/fio.$job.$block_size.$3.1.log" | |
| fi | |
| fio --output="$output" $job | |
| } | |
| # run all the jobs | |
| for job in "${JOBS[@]}" | |
| do | |
| # generate job file for current job | |
| for block_size in "${BLOCK_SIZES[@]}" | |
| do | |
| if [ "$job" != "randrw" ]; then | |
| echo "run $job in $block_size" | |
| gen_job_file $job $block_size | |
| run_test $job $block_size | |
| else | |
| for rate in "${RWMIXREADS[@]}" | |
| do | |
| echo "run $job in $block_size, rwmixread=$rate" | |
| gen_job_file $job $block_size $rate | |
| run_test $job $block_size $rate | |
| done | |
| fi | |
| done | |
| done | |
| bw_array=() | |
| iops_array=() | |
| lat_array=() | |
| select_bw() | |
| { | |
| index=$1 | |
| file=$2 | |
| # unit:KB/S | |
| bw=`grep "bw=" "$file" | awk -F[=,B]+ '{if(match($4, /[0-9]+K$/)) {printf("%d", substr($4, 0, length($4)-1));} else {printf("%d", int($4)/1024)}}'` | |
| bw_array[$index]="$bw" | |
| } | |
| select_iops() | |
| { | |
| index=$1 | |
| file=$2 | |
| iops=`grep "iops=" "$file" | awk -F[=,]+ '{print $6}'` | |
| iops_array[$index]="$iops" | |
| } | |
| select_lat() | |
| { | |
| index=$1 | |
| file=$2 | |
| # unit:ms | |
| line=`grep "lat" "$file" | grep "avg" | grep -v -E "clat|slat"` | |
| lat=`echo $line | awk -F[=,:]+ '{if($1 == "lat (usec)") {printf("%.2f", $7/1000);} else {printf("%.2f", $7)} }'` | |
| lat_array[$index]="$lat" | |
| } | |
| # use for test randrw | |
| bw_array_rw_read=() | |
| iops_array_rw_read=() | |
| lat_array_rw_read=() | |
| bw_array_rw_write=() | |
| iops_array_rw_write=() | |
| lat_array_rw_write=() | |
| select_bw_rw() | |
| { | |
| index=$1 | |
| file=$2 | |
| # unit:KB/S | |
| bw_read=`grep "bw=" "$file" | grep read | awk -F[=,B]+ '{if(match($4, /[0-9]+K$/)) {printf("%d", substr($4, 0, length($4)-1));} else {printf("%d", int($4)/1024)}}'` | |
| bw_write=`grep "bw=" "$file" | grep write | awk -F[=,B]+ '{if(match($4, /[0-9]+K$/)) {printf("%d", substr($4, 0, length($4)-1));} else {printf("%d", int($4)/1024)}}'` | |
| bw_array_rw_read[$index]="$bw_read" | |
| bw_array_rw_write[$index]="$bw_write" | |
| } | |
| select_iops_rw() | |
| { | |
| index=$1 | |
| file=$2 | |
| iops_read=`grep "iops=" "$file" | grep read | awk -F[=,]+ '{print $6}'` | |
| iops_write=`grep "iops=" "$file" | grep write | awk -F[=,]+ '{print $6}'` | |
| iops_array_rw_read[$index]="$iops_read" | |
| iops_array_rw_write[$index]="$iops_write" | |
| } | |
| select_lat_rw() | |
| { | |
| index=$1 | |
| file=$2 | |
| # unit:ms | |
| line=`grep "read" "$file" -A3 | grep "avg" | grep -v -E "clat|slat"` | |
| lat_read=`echo $line | awk -F[=,:]+ '{if($1 == "lat (usec)") {printf("%.2f", $7/1000);} else {printf("%.2f", $7)} }'` | |
| line=`grep "write" "$file" -A3 | grep "avg" | grep -v -E "clat|slat"` | |
| lat_write=`echo $line | awk -F[=,:]+ '{if($1 == "lat (usec)") {printf("%.2f", $7/1000);} else {printf("%.2f", $7)} }'` | |
| lat_array_rw_read[$index]="$lat_read" | |
| lat_array_rw_write[$index]="$lat_write" | |
| } | |
| # generate the test result table | |
| output_file="$OUTDIR/$OUTDIR.result" | |
| echo > "$output_file" | |
| for job in "${JOBS[@]}" | |
| do | |
| if [ "$job" != "randrw" ]; then | |
| echo "[$job] ${BLOCK_SIZES[@]}" >> "$output_file" | |
| for (( i = 0; i < ${#BLOCK_SIZES[@]}; ++i )) | |
| do | |
| block_size=${BLOCK_SIZES[$i]} | |
| file="$OUTDIR/fio.$job.$block_size.1.log" | |
| echo $file | |
| select_bw $i $file | |
| select_iops $i $file | |
| select_lat $i $file | |
| done | |
| echo "[bw] ${bw_array[@]}" >> $output_file | |
| echo "[lat] ${lat_array[@]}" >> $output_file | |
| echo "[iops] ${iops_array[@]}" >> $output_file | |
| echo >> $output_file | |
| # clear array | |
| bw_array=() | |
| iops_array=() | |
| lat_array=() | |
| else | |
| for rate in "${RWMIXREADS[@]}" | |
| do | |
| echo "[$job"_"$rate] ${BLOCK_SIZES[@]}" >> "$output_file" | |
| for (( i = 0; i < ${#BLOCK_SIZES[@]}; ++i )) | |
| do | |
| block_size=${BLOCK_SIZES[$i]} | |
| file="$OUTDIR/fio.$job.$block_size.$rate.1.log" | |
| echo $file | |
| select_bw_rw $i $file | |
| select_iops_rw $i $file | |
| select_lat_rw $i $file | |
| done | |
| echo "[bw_read] ${bw_array_rw_read[@]}" >> $output_file | |
| echo "[lat_read] ${lat_array_rw_read[@]}" >> $output_file | |
| echo "[iops_read] ${iops_array_rw_read[@]}" >> $output_file | |
| echo "[bw_write] ${bw_array_rw_write[@]}" >> $output_file | |
| echo "[lat_write] ${lat_array_rw_write[@]}" >> $output_file | |
| echo "[iops_write] ${iops_array_rw_write[@]}" >> $output_file | |
| echo >> $output_file | |
| # clear array | |
| bw_array_rw_read=() | |
| iops_array_rw_read=() | |
| lat_array_rw_read=() | |
| bw_array_rw_write=() | |
| iops_array_rw_write=() | |
| lat_array_rw_write=() | |
| done | |
| fi | |
| done | |
| cleanup |