On 12/4/18 6:47 PM, Josef Bacik wrote: > This is a test to verify io.latency is working properly. It does this > by first running a fio job by itself to figure out how fast it runs. > Then we calculate some thresholds, set up 2 cgroups, a fast and a slow > cgroup, and then run the same job in both groups simultaneously. We > should see the slow group get throttled until the first cgroup is able > to finish, and then the slow cgroup will be allowed to finish. > Hi, two small typos below. > Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx> > --- > tests/block/025 | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/block/025.out | 1 + > 2 files changed, 134 insertions(+) > create mode 100644 tests/block/025 > create mode 100644 tests/block/025.out > > diff --git a/tests/block/025 b/tests/block/025 > new file mode 100644 > index 000000000000..88ce7cca944e > --- /dev/null > +++ b/tests/block/025 > @@ -0,0 +1,133 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-3.0+ > +# > +# Test io.latency to make sure it's protecting the higher priority group > +# properly. > + > +. tests/block/rc > + > +DESCRIPTION="test the io.latency interface to make sure it's working right" > + > +requires() { > + _have_cgroup2_controller_file io io.latency && _have_fio && \ > + _have_program python > +} > + > +_fio_results_key() { > + _job=$1 > + _key=$2 > + _resultfile=$3 > + > + python src/fio-key-value.py -k $_key -j $_job $_resultfile > +} > + > +test_device() { > + local fio_config_single fio_config_double fio_results fio_args qd > + > + fio_config_single=${TMPDIR}/single.fio > + fio_config_double=${TMPDIR}/double.fio > + fio_results=${TMPDIR}/025.json > + fio_args="--output-format=json --output=${fio_results}" > + qd=$(cat ${TEST_DEV_SYSFS}/queue/nr_requests) > + > + cat << EOF > "${fio_config_single}" > + [fast] > + filename=${TEST_DEV} > + direct=1 > + allrandrepeat=1 > + readwrite=randrw > + size=4G > + ioengine=libaio > + iodepth=${qd} > + fallocate=none > + randseed=12345 > +EOF > + > + cat << EOF > "${fio_config_double}" > + [global] > + filename=${TEST_DEV} > + direct=1 > + allrandrepeat=1 > + readwrite=randrw > + size=4G > + ioengine=libaio > + iodepth=${qd} > + fallocate=none > + randseed=12345 > + > + [fast] > + cgroup=blktests/fast > + > + [slow] > + cgroup=blktests/slow > +EOF > + # We run the test once so we have an idea of how fast this workload will > + # go with nobody else doing IO on the device. > + if ! fio ${fio_args} ${fio_config_single}; then > + echo "fio exited with status $?" > + return 1 > + fi > + > + _time_taken=$(_fio_results_key fast job_runtime ${fio_results}) > + if [ "${_time_taken}" = "" ]; then > + echo "fio doesn't report job_runtime" > + return 1 > + fi > + > + echo "normal time taken ${_time_taken}" >> $FULL > + > + # There's no way to predict how the two workloads are going to affect > + # each other, so we weant to set thresholds to something reasonable so > + # we can verify io.latency is doing something. This means we set 15% > + # for the fast cgroup, just to give us enough wiggle room as throttling > + # doesn't happen immediately. But if we have a super fast disk we could > + # run both groups really fast and make it under our fast threshold, so > + # we need to set a threshold for the slow group at 50%. We assume that > + # if it was faster than 50% of the fast threshold then we probably > + # didn't throttle and we can assume io.latency is broken. > + _fast_thresh=$((${_time_taken} + ${_time_taken} * 15 / 100)) > + _slow_thresh=$((${_time_taken} + ${_time_taken} * 50 / 100)) > + echo "fast threshold time is ${_fast_thresh}" >> $FULL > + echo "slow threshold time is ${_slow_thresh}" >> $FULL > + > + # Create teh cgroup files Typo, "the". ^ > + _dir=$(_cgroup2_base_dir)/blktests > + echo "+io" > ${_dir}/cgroup.subtree_control > + mkdir ${_dir}/fast > + mkdir ${_dir}/slow > + > + # We set teh target to 1usec because we could have a fast device that is Also here, "the". ^ > + # capable of remarkable IO latencies that would skew the test. It needs > + # to be low enough that we do actually throttle the slow group, > + # otherwise the test will fail when there's nothing wrong. > + _major=$((0x$(stat -c "%t" ${TEST_DEV}))) > + _minor=$((0x$(stat -c "%T" ${TEST_DEV}))) > + echo "${_major}:${_minor} is our device" >> $FULL > + if ! echo "${_major}:${_minor} target=1" > ${_dir}/fast/io.latency; then > + echo "Failed to set our latency target" > + return 1 > + fi > + > + if ! fio ${fio_args} ${fio_config_double}; then > + echo "fio exited with status $?" > + return 1 > + fi > + > + _fast_time=$(_fio_results_key fast job_runtime ${fio_results}) > + echo "Fast time ${_fast_time}" >> $FULL > + _slow_time=$(_fio_results_key slow job_runtime ${fio_results}) > + echo "Slow time ${_slow_time}" >> $FULL > + There is a trailing whitespace in the above line. > + if [ ${_fast_thresh} -lt ${_fast_time} ]; then > + echo "Too much of a performance drop for the protected workload" > + return 1 > + fi > + > + if [ ${_slow_thresh} -gt ${_slow_time} ]; then > + echo "The slow group does not appear to have been throttled" > + return 1 > + fi > + > + echo "Silence is golden" > + return 0 > +} > diff --git a/tests/block/025.out b/tests/block/025.out > new file mode 100644 > index 000000000000..c19ff631b9b5 > --- /dev/null > +++ b/tests/block/025.out > @@ -0,0 +1 @@ > +Silence is golden > Thank you, Federico
Attachment:
signature.asc
Description: OpenPGP digital signature