Commit a1e4e727 authored by Darek Stojaczyk's avatar Darek Stojaczyk Committed by Jim Harris
Browse files

test/qos: get rid of check_qos_works_well()



check_qos_works_well() has been split into two separate
functions: run_fio() and verify_qos_limits().

Change-Id: I8c112ab93aed9f16d80c9a0a3f61280c44bf6539
Signed-off-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/451888


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKarol Latecki <karol.latecki@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avataryidong0635 <dongx.yi@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 22364ca8
Loading
Loading
Loading
Loading
+39 −49
Original line number Diff line number Diff line
@@ -9,46 +9,30 @@ source $rootdir/test/iscsi_tgt/common.sh
# $2 = test type posix or vpp. defaults to posix.
iscsitestinit $1 $2

function check_qos_works_well() {
	local enable_limit=$1
	local qos_limit=$2
	local check_qos=$4
	local retval=0
	local iostats

	iostats=$($rpc_py get_bdevs_iostat -b $3)
	start_io_count=$(jq -r '.bdevs[0].num_read_ops' <<< "$iostats")
	start_bytes_read=$(jq -r '.bdevs[0].bytes_read' <<< "$iostats")

	$fio_py iscsi 1024 128 randread 5 1

	iostats=$($rpc_py get_bdevs_iostat -b $3)
	end_io_count=$(jq -r '.bdevs[0].num_read_ops' <<< "$iostats")
	end_bytes_read=$(jq -r '.bdevs[0].bytes_read' <<< "$iostats")

	IOPS_RESULT=$(((end_io_count-start_io_count)/5))
	BANDWIDTH_RESULT=$(((end_bytes_read-start_bytes_read)/5))

	if [ $LIMIT_TYPE = IOPS ]; then
		read_result=$IOPS_RESULT
	else
		read_result=$BANDWIDTH_RESULT
	fi
function run_fio() {
	local bdev_name=$1
	local iostats=$($rpc_py get_bdevs_iostat -b $bdev_name)
	local run_time=5

	if [ $enable_limit = true ]; then
		#qos realization is related with bytes transfered.It currently have like 5% variation.
		retval=$(echo "$qos_limit*0.85 < $read_result && $read_result < $qos_limit*1.05" | bc)
		if [ $retval -eq 0 ]; then
			echo "Failed to limit the io read rate of malloc bdev by qos"
			exit 1
		fi
	else
		retval=$(echo "$read_result > $qos_limit" | bc)
		if [ $retval -eq 0 ]; then
			echo "$read_result less than $qos_limit - expected greater than"
			exit 1
		fi
	fi
	local start_io_count=$(jq -r '.bdevs[0].num_read_ops' <<< "$iostats")
	local start_bytes_read=$(jq -r '.bdevs[0].bytes_read' <<< "$iostats")

	$fio_py iscsi 1024 128 randread $run_time 1

	iostats=$($rpc_py get_bdevs_iostat -b $bdev_name)
	local end_io_count=$(jq -r '.bdevs[0].num_read_ops' <<< "$iostats")
	local end_bytes_read=$(jq -r '.bdevs[0].bytes_read' <<< "$iostats")

	IOPS_RESULT=$(((end_io_count-start_io_count)/$run_time))
	BANDWIDTH_RESULT=$(((end_bytes_read-start_bytes_read)/$run_time))
}

function verify_qos_limits() {
	local result=$1
	local limit=$2

	[ "$(bc <<< "$result > $limit*0.85")" -eq 1 ] && \
	[ "$(bc <<< "$result < $limit*1.05")" -eq 1 ]
}

if [ -z "$TARGET_IP" ]; then
@@ -67,7 +51,6 @@ MALLOC_BDEV_SIZE=64
MALLOC_BLOCK_SIZE=512
IOPS_RESULT=
BANDWIDTH_RESULT=
LIMIT_TYPE=IOPS
rpc_py="$rootdir/scripts/rpc.py"
fio_py="$rootdir/scripts/fio.py"

@@ -98,7 +81,7 @@ iscsiadm -m node --login -p $TARGET_IP:$ISCSI_PORT
trap "iscsicleanup; killprocess $pid; iscsitestfini $1 $2; exit 1" SIGINT SIGTERM EXIT

# Run FIO without any QOS limits to determine the raw performance
check_qos_works_well false 0 Malloc0
run_fio Malloc0

# Set IOPS/bandwidth limit to 50% of the actual unrestrained performance.
IOPS_LIMIT=$(($IOPS_RESULT/2))
@@ -117,29 +100,36 @@ READ_BANDWIDTH_LIMIT=$(($READ_BANDWIDTH_LIMIT_MB*1024*1024))

# Limit the I/O rate by RPC, then confirm the observed rate matches.
$rpc_py set_bdev_qos_limit Malloc0 --rw_ios_per_sec $IOPS_LIMIT
check_qos_works_well true $IOPS_LIMIT Malloc0
run_fio Malloc0
verify_qos_limits $IOPS_RESULT $IOPS_LIMIT

# Now disable the rate limiting, and confirm the observed rate is not limited anymore.
$rpc_py set_bdev_qos_limit Malloc0 --rw_ios_per_sec 0
check_qos_works_well false $IOPS_LIMIT Malloc0
run_fio Malloc0
[ "$IOPS_RESULT" -gt "$IOPS_LIMIT" ]

# Limit the I/O rate again.
$rpc_py set_bdev_qos_limit Malloc0 --rw_ios_per_sec $IOPS_LIMIT
check_qos_works_well true $IOPS_LIMIT Malloc0
run_fio Malloc0
verify_qos_limits $IOPS_RESULT $IOPS_LIMIT

echo "I/O rate limiting tests successful"

# Limit the I/O bandwidth rate by RPC, then confirm the observed rate matches.
LIMIT_TYPE=BANDWIDTH
$rpc_py set_bdev_qos_limit Malloc0 --rw_ios_per_sec 0 --rw_mbytes_per_sec $BANDWIDTH_LIMIT_MB
check_qos_works_well true $BANDWIDTH_LIMIT Malloc0
run_fio Malloc0
verify_qos_limits $BANDWIDTH_RESULT $BANDWIDTH_LIMIT

# Now disable the bandwidth rate limiting, and confirm the observed rate is not limited anymore.
$rpc_py set_bdev_qos_limit Malloc0 --rw_mbytes_per_sec 0
check_qos_works_well false $BANDWIDTH_LIMIT Malloc0
run_fio Malloc0
[ "$BANDWIDTH_RESULT" -gt "$BANDWIDTH_LIMIT" ]

# Limit the I/O bandwidth rate again with both read/write and read/only.
$rpc_py set_bdev_qos_limit Malloc0 --rw_mbytes_per_sec $BANDWIDTH_LIMIT_MB --r_mbytes_per_sec $READ_BANDWIDTH_LIMIT_MB
check_qos_works_well true $READ_BANDWIDTH_LIMIT Malloc0
run_fio Malloc0
verify_qos_limits $BANDWIDTH_RESULT $READ_BANDWIDTH_LIMIT

echo "I/O bandwidth limiting tests successful"

iscsicleanup