blob: feb1d5144d40dd09e23cb6e716fd216b95733b27 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#!/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
|