mirror of
https://github.com/ceph/ceph
synced 2024-12-28 06:23:08 +00:00
7838d3e18e
The 'rbd bench' command was recently modified to print IEC units instead of bytes/sec. This broke the handling for QoS throughput tests since it was incorrectly evaluating the available RBD throughput. Additionally, the QoS tests should use a "<=" comparison operator since the QoS is the upper-bound limit. Signed-off-by: Jason Dillaman <dillaman@redhat.com>
91 lines
3.4 KiB
Bash
Executable File
91 lines
3.4 KiB
Bash
Executable File
#!/bin/sh -ex
|
|
|
|
POOL=rbd
|
|
IMAGE=test$$
|
|
IMAGE_SIZE=1G
|
|
TOLERANCE_PRCNT=10
|
|
|
|
rbd_bench() {
|
|
local image=$1
|
|
local type=$2
|
|
local total=$3
|
|
local qos_type=$4
|
|
local qos_limit=$5
|
|
local iops_var_name=$6
|
|
local bps_var_name=$7
|
|
local timeout=$8
|
|
local timeout_cmd=""
|
|
|
|
if [ -n "${timeout}" ]; then
|
|
timeout_cmd="timeout --preserve-status ${timeout}"
|
|
fi
|
|
|
|
# parse `rbd bench` output for string like this:
|
|
# elapsed: 25 ops: 2560 ops/sec: 100.08 bytes/sec: 409.13 MiB
|
|
iops_bps=$(${timeout_cmd} rbd bench "${image}" \
|
|
--io-type ${type} --io-size 4K \
|
|
--io-total ${total} --rbd-cache=false \
|
|
--rbd_qos_${qos_type}_limit ${qos_limit} |
|
|
awk '/elapsed:.* GiB/ {print int($6) ":" int($8) * 1024 * 1024 * 1024}
|
|
/elapsed:.* MiB/ {print int($6) ":" int($8) * 1024 * 1024}
|
|
/elapsed:.* KiB/ {print int($6) ":" int($8) * 1024}
|
|
/elapsed:.* B/ {print int($6) ":" int($8)}')
|
|
eval ${iops_var_name}=${iops_bps%:*}
|
|
eval ${bps_var_name}=${iops_bps#*:}
|
|
}
|
|
|
|
rbd create "${POOL}/${IMAGE}" -s ${IMAGE_SIZE}
|
|
rbd bench "${POOL}/${IMAGE}" --io-type write --io-size 4M --io-total ${IMAGE_SIZE}
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" write ${IMAGE_SIZE} iops 0 iops bps 60
|
|
iops_unlimited=$iops
|
|
bps_unlimited=$bps
|
|
|
|
test "${iops_unlimited}" -ge 20 || exit 0
|
|
|
|
io_total=$((bps_unlimited * 30))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" write ${io_total} iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" write ${io_total} write_iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" write ${io_total} bps $((bps_unlimited / 2)) iops bps
|
|
test "${bps}" -le $((bps_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" write ${io_total} write_bps $((bps_unlimited / 2)) iops bps
|
|
test "${bps}" -le $((bps_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} iops 0 iops bps
|
|
iops_unlimited=$iops
|
|
bps_unlimited=$bps
|
|
|
|
test "${iops_unlimited}" -ge 20 || exit 0
|
|
|
|
io_total=$((bps_unlimited * 30))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} read_iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} bps $((bps_unlimited / 2)) iops bps
|
|
test "${bps}" -le $((bps_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} read_bps $((bps_unlimited / 2)) iops bps
|
|
test "${bps}" -le $((bps_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
# test a config override is applied
|
|
rbd config image set "${POOL}/${IMAGE}" rbd_qos_iops_limit $((iops_unlimited / 4))
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 4 * (100 + TOLERANCE_PRCNT) / 100))
|
|
rbd config image remove "${POOL}/${IMAGE}" rbd_qos_iops_limit
|
|
rbd_bench "${POOL}/${IMAGE}" read ${io_total} iops $((iops_unlimited / 2)) iops bps
|
|
test "${iops}" -le $((iops_unlimited / 2 * (100 + TOLERANCE_PRCNT) / 100))
|
|
|
|
rbd rm "${POOL}/${IMAGE}"
|
|
|
|
echo OK
|