#!/bin/bash COUNT=$1 RUNTIME=12 NR_FIO_JOBS=8 SCSI_DBG_NDELAY=10000 # set higher aio limit echo 524288 > /proc/sys/fs/aio-max-nr #figure out the CAN_QUEUE CAN_QUEUE=$((($COUNT + 1) * ($COUNT / 2) / 2)) rmmod scsi_debug > /dev/null 2>&1 modprobe scsi_debug virtual_gb=128 max_luns=$COUNT ndelay=$SCSI_DBG_NDELAY max_queue=$CAN_QUEUE # figure out scsi_debug disks HOSTS=`ls -d /sys/bus/pseudo/drivers/scsi_debug/adapter0/host*` HOSTNAME=`basename $HOSTS` HOST=`echo $HOSTNAME | grep -o -E '[0-9]+'` SDISKS=`ls -d /sys/bus/pseudo/drivers/scsi_debug/adapter*/$HOSTNAME/target*/*/block/*` DISKS="" for SD in $SDISKS; do DISKS+="/dev/"`basename $SD` DISKS+=" " done MY_CAN_QUEUE=`cat /sys/class/scsi_host/$HOSTNAME/can_queue` echo "host: $HOSTNAME, can_queue: $MY_CAN_QUEUE, LUNs: $COUNT" USE_MQ=`cat /sys/module/scsi_mod/parameters/use_blk_mq` if [ $USE_MQ = "Y" ]; then SCHEDS=("none" "mq-deadline" "kyber") else SCHEDS=("noop" "deadline" "cfq") fi SCHEDS_NR=3 FIO_JOBS="" cnt=0 for SD in $DISKS; do cnt=$((cnt+1)) FIO_JOBS=$FIO_JOBS" --name=job1 --filename=$SD: " DEV_NAME=`basename $SD` Q_PATH=/sys/block/$DEV_NAME/queue sched_idx=$(($cnt % $SCHEDS_NR)) echo ${SCHEDS[$sched_idx]} > $Q_PATH/scheduler echo $cnt > $Q_PATH/../device/queue_depth MY_SCHED=`cat $Q_PATH/scheduler | sed -n 's/.*\[\(.*\)\].*/\1/p'` MY_SCSI_QD=`cat $Q_PATH/../device/queue_depth` #echo "Dev. $cnt-$DEV_NAME, SCHED: $MY_SCHED, SCSI QD: $MY_SCSI_QD" done echo "start I/O: $NR_FIO_JOBS jobs/disk" fio --rw=randread --size=128G --direct=1 --ioengine=libaio --iodepth=2048 --numjobs=$NR_FIO_JOBS --bs=4k --group_reporting=1 --group_reporting=1 --runtime=$RUNTIME --loops=10000 $FIO_JOBS > /dev/null 2>&1 & sleep 7 echo -e "delete all disks\n" for SD in $DISKS; do DEV_NAME=`basename $SD` DPATH=/sys/block/$DEV_NAME/device [ -f $DPATH/delete ] && echo 1 > $DPATH/delete done wait