直接上代码:
#!/bin/bash
#设置测试参数
iodepth=1
numjobs=1
runtime=10
size=200m
test_dir1=$1
test_dir2=$2
test_dir3=$3
timestamp=$(date +%Y%m%d_%H%M%S)
#检查脚本参数
if [ $# -eq 0 ]; then
echo "Error: This script requires at least one argument."
echo "Usage: $0 <argument1> [argument2 ...]"
echo "for example:sh $0 /raid5,not /raid5/"
exit 1
fi
#定义生成csv表格函数
function fiocsv(){
bw=`cat $5 | grep -i "iops="|awk '{print $1 $3}'`
iops=`cat $5 |grep -i "iops=" |awk '{print $1 $2}'|awk -F ',' '{print $1}'`
lat=`cat $5 |grep -w lat|grep avg|awk '{print $1 $2 $5}'|awk -F "," '{print $1}'`
echo ${test_dir},$1,$2,$3,$4,$bw,$iops,$lat >>${test_dir}/fio_result_${timestamp}/${test_dir}_fio_result.csv
}
function fiocsvmix(){
mix_bw=`cat $5 |grep -i "iops=" |awk '{print $1 $3}'`
mix_iops=`cat $5 |grep -i "iops=" |awk '{print $1 $2}'|awk -F ',' '{print $1}'`
mix_read_lat=`cat $5 |grep -w "lat"|grep avg |head -1|awk '{print "read:",$1,$2,$5}'`
mix_write_lat=`cat $5 |grep -w "lat"|grep avg |tail -1|awk '{print "write:",$1,$2,$5}'`
echo ${test_dir},$1,$2,$3,$4,$mix_bw,$mix_iops,"$mix_read_lat $mix_write_lat" >>${test_dir}/fio_result_${timestamp}/${test_dir}_fio_result.csv
}
#创建文件结果存放目录
for test_dir in $test_dir1 $test_dir2 $test_dir3
do
if [ ! -d ${test_dir}/fio_result_${timestamp} ];then
mkdir ${test_dir}/fio_result_${timestamp}
fi
echo RW,BS,Iodepth,jobs,BW,IOPS,LAT >${test_dir}/fio_result_${timestamp}/${test_dir}_fio_result.csv
done
#进行随机读,随机写,顺序读,顺序写测试
for rw in randread randwrite read write
do
for bs in 4k 8k 64k 256k
do
for test_dir in $test_dir1 $test_dir2 $test_dir3
do
echo "$test_dir $rw $bs iodepth=$iodepth numjobs=$numjobs $rw test start"
fio --name=$rw --numjobs=$numjobs --iodepth=$iodepth --ioengine=libaio --rw=$rw --bs=$bs --runtime=$runtime --direct=1 --size=$size --group_reporting=1 --directory=${test_dir} >${test_dir}/fio_result_${timestamp}/${rw}_${bs}_${iodepth}_${numjobs}.rec
fiocsv $rw $bs $iodepth $numjobs ${test_dir}/fio_result_${timestamp}/${rw}_${bs}_${iodepth}_${numjobs}.rec
done
done
done
#进行混合随机读写,混合读写测试
for mixrw in randrw readwrite
do
for mixbs in 4k 8k 64k 256k
do
for test_dir in $test_dir1 $test_dir2 $test_dir3
do
echo "$test_dir $mixrw $mixbs iodepth=$iodepth numjobs=$numjobs $mixrw test start"
fio --name=$mixrw --numjobs=$numjobs --iodepth=$iodepth --ioengine=libaio --rw=$mixrw --bs=$mixbs --runtime=$runtime --direct=1 --size=$size --group_reporting=1 --directory=${test_dir} >${test_dir}/fio_result_${timestamp}/${mixrw}_${mixbs}_${iodepth}_${numjobs}.rec
fiocsv $mixrw $mixbs $iodepth $numjobs ${test_dir}/fio_result_${timestamp}/${mixrw}_${mixbs}_${iodepth}_${numjobs}.rec
done
done
done
最终结果如下: