做function测试的时候,经常会遇见测试多盘的情况,所以我们有时候是有必要会写一些基本的测试的脚本。下面我们看一个案例:
测试case
对所有服务器的单盘执行FIO Sequential read、Sequential Write、Random Read、Random Write性能测试,每个盘单独启一个FIO进程,参数配置如下, 每个测试执行10分钟,全盘空间测试,把每一个盘的BW、IOPS、平均Latency、99.99% QoS整理写入测试报告。
【FIO配置】
Block:4K ,8K,16K,32K,64K,128K,256K,512K,1024k;
QD:1,2,4,8,16,32,64,128;
Jobs:1,4,32;
下面我们来写一下这个测试脚本
1 首先我们要取出所有待测试的盘(OS盘除外),方法有很多种(可以参考我上一遍文章)
比如下面这个SUT 我们要测试"SN03"的分位的所有盘,并且创建以盘符命名的文件夹,用来存放每个盘的IO log。
lsscsi
[0:0:0:0] cd/dvd AMI Virtual CDROM0 1.00 /dev/sr0
[1:0:0:0] disk ATA Micron_5200_MTFD U004 /dev/sda
[1:0:1:0] disk ATA ST16000NM001G-2K SN03 /dev/sdb
[1:0:2:0] disk ATA ST16000NM001G-2K SN03 /dev/sdc
[1:0:3:0] disk ATA ST16000NM001G-2K SN03 /dev/sdd
[1:0:4:0] disk ATA ST16000NM001G-2K SN03 /dev/sde
[1:0:5:0] disk ATA ST16000NM001G-2K SN03 /dev/sdf
[1:0:6:0] disk ATA ST16000NM001G-2K SN03 /dev/sdg
[1:0:7:0] disk ATA ST16000NM001G-2K SN03 /dev/sdh
[1:0:8:0] disk ATA ST16000NM001G-2K SN03 /dev/sdi
[1:0:9:0] disk ATA ST16000NM001G-2K SN03 /dev/sdj
[1:0:10:0] disk ATA ST16000NM001G-2K SN03 /dev/sdk
[1:0:11:0] disk ATA ST16000NM001G-2K SN03 /dev/sdl
[1:0:12:0] disk ATA ST16000NM001G-2K SN03 /dev/sdm
[1:0:13:0] disk ATA ST16000NM001G-2K SN03 /dev/sdn
[1:0:14:0] disk ATA ST16000NM001G-2K SN03 /dev/sdo
[1:0:15:0] disk ATA ST16000NM001G-2K SN03 /dev/sdp
[1:0:16:0] disk ATA ST16000NM001G-2K SN03 /dev/sdq
[1:0:17:0] disk ATA ST16000NM001G-2K SN03 /dev/sdr
[1:0:18:0] disk ATA ST16000NM001G-2K SN03 /dev/sds
[1:0:19:0] disk ATA ST16000NM001G-2K SN03 /dev/sdt
[1:0:20:0] disk ATA ST16000NM001G-2K SN03 /dev/sdu
[1:0:21:0] disk ATA ST16000NM001G-2K SN03 /dev/sdv
[1:0:22:0] disk ATA ST16000NM001G-2K SN03 /dev/sdw
[1:0:23:0] disk ATA ST16000NM001G-2K SN03 /dev/sdx
[1:0:24:0] disk ATA ST16000NM001G-2K SN03 /dev/sdy
#!/bin/bash
echo "all hdds random and Sequence performance test"
for DEV in $(lsscsi |grep "SN03"|awk '{print $NF}'|awk -F "/" '{print $NF}')
do
mkdir $DEV
done
2.我们将对应的fio配置嵌套在for循环里
最后一层for循环 {read,write,randread,randwrite}四个参数分别代表顺序读,顺序写,随机读,随机写。
echo "all hdds random and Sequence performance test"
for DEV in $(lsscsi |grep "SN03"|awk '{print $NF}'|awk -F "/" '{print $NF}')
do
mkdir $DEV
for blocksize in 4 8 16 32 64 128 256 512 1024
do
for QD in 1 2 4 8 16 32 64 128 256
do
for jobs in 1 4 32
do
for item in {read,write,randread,randwrite}
do
done
done
done
done
done
3 将fio写到最后一层循环里
#!/bin/bash
echo "all hdds random and Sequence performance test"
for DEV in $(lsscsi |grep "SN03"|awk '{print $NF}'|awk -F "/" '{print $NF}')
do
mkdir $DEV
for blocksize in 4 8 16 32 64 128 256 512 1024
do
for QD in 1 2 4 8 16 32 64 128 256
do
for jobs in 1 4 32
do
for item in {read,write,randread,randwrite}
do
fio --name=${blocksie}kB_${item}_${jobs}job_QD${QD} --filename=/dev/${DEV} --direct=1 --thread=1 --numjobs=${jobs} --iodepth=${QD} --rw=$item --bs=${blocksize}k --runtime=200 --time_based=1 --ramp_time=60 --size=100% --norandommap=1 --randrepeat=0 --group_reporting --log_avg_msec=1000 --bwavgtime=1000 --minimal >>${DEV}/${DEV}_${item}_data.log
done
done
done
done
done
4.注意:我们的目的是让其多盘同时进行IO测试,但是目前来看,脚本是单进程运行的,所以我们需要用一个&加在第二层for循环后面,这样就能让其所有的盘同时进行IO测试。
#!/bin/bash
echo "all hdds random and Sequence performance test"
for DEV in $(lsscsi |grep "SN03"|awk '{print $NF}'|awk -F "/" '{print $NF}')
do
mkdir $DEV
for blocksize in 4 8 16 32 64 128 256 512 1024
do
for QD in 1 2 4 8 16 32 64 128 256
do
for jobs in 1 4 32
do
for item in {read,write,randread,randwrite}
do
fio --name=${blocksie}kB_${item}_${jobs}job_QD${QD} --filename=/dev/${DEV} --direct=1 --thread=1 --numjobs=${jobs} --iodepth=${QD} --rw=$item --bs=${blocksize}k --runtime=200 --time_based=1 --ramp_time=60 --size=100% --norandommap=1 --randrepeat=0 --group_reporting --log_avg_msec=1000 --bwavgtime=1000 --minimal >>${DEV}/${DEV}_${item}_data.log
done
done
done
done &
done