Spdk/scripts/fio-wrapper
Kamil Godzwon 14c0f94c88 test/fio: supress fio output files
verify.state files are not very useful because
we fail the tests at any first failure.
If there was something wrong with IO verification
then autotest.sh would fail.

Fio files with metrics output (IOPS, BW, latency, etc)
are also not very useful as per-patch tests are not
focused on benchmarking.

Fixes #2546

Signed-off-by: Kamil Godzwon <kamilx.godzwon@intel.com>
Change-Id: I33fbe2fb0749d840f08ffe0d606d206268140991
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13019
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Karol Latecki <karol.latecki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2022-06-23 07:43:36 +00:00

147 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
rootdir=$(readlink -f "$(dirname "$0")/../")
shopt -s nullglob extglob
fio_config() {
local devs=("$@") dev
cat <<- FIO
[global]
thread=1
invalidate=1
rw=$testtype
time_based=1
runtime=$runtime
ioengine=libaio
direct=1
bs=$blocksize
iodepth=$iodepth
norandommap=$((verify == 1 ? 0 : 1))
numjobs=$numjobs
verify_dump=1
verify_backlog=512
verify_state_save=0
FIO
if ((verify == 1)); then
cat <<- FIO
do_verify=$verify
verify=crc32c-intel
FIO
fi
for dev in "${!devs[@]}"; do
cat <<- FIO
[job$dev]
filename=/dev/${devs[dev]}
FIO
done
}
run_fio() {
fio_config "$@" | fio -
}
get_iscsi() {
while read -r; do
[[ $REPLY =~ "Attached scsi disk "(sd[a-z]+) ]] && echo "${BASH_REMATCH[1]}"
done < <(iscsiadm -m session -P 3)
}
get_nvme() {
local blocks nvme nvme_sub
for nvme in /sys/class/nvme/nvme+([0-9]); do
# Make sure we touch only the block devices which belong to bdev subsystem and
# use supported protocols.
[[ $(< "$nvme/transport") == tcp || $(< "$nvme/transport") == rdma ]] || continue
for nvme_sub in /sys/class/nvme-subsystem/nvme-subsys+([0-9]); do
[[ -e $nvme_sub/${nvme##*/} ]] || continue
[[ $(< "$nvme_sub/model") == "SPDK bdev Controller"* ]] || continue
blocks+=("$nvme_sub/${nvme##*/}"n*)
done
done
blocks=("${blocks[@]##*/}")
printf '%s\n' "${blocks[@]}"
}
get_devices() {
local devs=("$@")
if ((${#devs[@]} == 0)); then
case "$protocol" in
iscsi) devs=($(get_iscsi)) ;;
nvmf) devs=($(get_nvme)) ;;
*) ;;
esac
fi
printf '%s\n' "${devs[@]}"
}
configure_devices() {
local devs=("$@") dev qd
if [[ -e $rootdir/scripts/sync_dev_uevents.sh ]]; then
"$rootdir/scripts/sync_dev_uevents.sh" block/disk "${devs[@]}"
fi > /dev/null
for dev in "${devs[@]}"; do
qd=128
# Disable all merge tries"
echo 2 > "/sys/block/$dev/queue/nomerges"
# FIXME: nr_requests already has its default value at 128. Also, when no
# scheduler is associated with the device this value cannot be changed
# and is automatically adjusted as well.
# echo 128 > "/sys/block/$dev/queue/nr_requests"
if [[ -e /sys/block/$dev/device/queue_depth ]]; then
# FIXME: Is this really needed though? Can't we use the default? This is not
# very deterministic as depending on the device we may end up with different
# qd in the range of 1-128.
while ((qd > 0)) && ! echo "$qd" > "/sys/block/$dev/device/queue_depth"; do
((--qd))
done 2> /dev/null
if ((qd == 0)); then
printf 'Failed to set queue_depth (%s)\n' "$dev"
return 1
fi
printf 'queue_depth set to %u (%s)\n' "$qd" "$dev"
else
printf 'Could not set queue depth (%s)\n' "$dev" >&2
fi
echo none > "/sys/block/$dev/queue/scheduler"
done
}
# Defaults
blocksize=4096
iodepth=1
numjobs=1
protocol="nvmf"
runtime=1
testtype="read"
verify=0
# Keep short args compatible with fio.py
while getopts :i:d:n:p:r:t:v arg; do
case "$arg" in
i) blocksize=$OPTARG ;;
d) iodepth=$OPTARG ;;
n) numjobs=$OPTARG ;;
p) protocol=$OPTARG ;;
r) runtime=$OPTARG ;;
t) testtype=$OPTARG ;;
v) verify=1 ;;
*) ;;
esac
done
shift $((OPTIND - 1))
devices=($(get_devices "$@"))
if ((${#devices[@]} == 0)); then
printf '* No devices were found for the test, aborting\n' >&2
exit 1
fi
fio_config "${devices[@]}"
configure_devices "${devices[@]}" && run_fio "${devices[@]}"