#!/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
view raw run_fio.sh hosted with ❤ by GitHub