fiotest/fiotest_4x0595.sh
2024-03-20 09:31:35 -05:00

156 lines
3.2 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Test filesystem path with fio database simulation
# - 4k blocks, 5% read, 95% write
# - threaded mode, 128 request queue depth
# - fewer large files, random I/O
#
# Required:
# - FS mounted at /fiotest (or use -d / -x)
# - 5G space free in filesystem path
# - 'fio' installed (yum/dnf/apt)
#
# Will create:
# - /fiotest/fio/4x0595.fio (config)
# - /fiotest/fio/4x0595_$(uname -r).txt (results)
# - /fiotest/fio/cache (cache)
#
# SPDX-License-Identifier: MIT
_VERSION="0.0.1"
_NAME=$(basename "${0}")
# usage
function usage() {
echo "${_NAME} version ${_VERSION}"
echo
echo "Usage: ${_NAME} [OPTIONS...]"
echo
echo " Options:"
echo " -d <dir> Directory to use (default: /fiotest)"
echo " -o Overwrite existing fio config"
echo " -x Do not test if dir is a mount point"
echo " -V Version of program"
echo " -h This help text"
echo
}
# defaults
declare FMOUNT="/fiotest"
declare _OCFG=0
declare _XMNT=1
# user input
while getopts "d:oxVh" opt; do
case "$opt" in
d)
FMOUNT="${OPTARG}" ;;
o)
_OCFG=1 ;;
x)
_XMNT=0 ;;
V)
echo "${_NAME} version ${_VERSION}"
exit 0 ;;
h)
usage
exit 0 ;;
*)
echo "Unrecognized option: $OPTARG (Run '$_NAME -h' for help)"
exit 1 ;;
esac
done
shift $((OPTIND-1))
# strip trailing slash if present
FMOUNT=${FMOUNT%/}
# runtime vars
FDIR="${FMOUNT}/fio"
FCONF="${FDIR}/4x0595.fio"
FLOG="${FDIR}/4x0595_$(uname -r).txt"
FCACHE="${FDIR}/cache"
# ensure we can run fio properly
function preflight() {
# fio test
if [[ -z "$(command -v fio 2>/dev/null)" ]]; then
echo "Install 'fio' with yum/dnf/apt first. Exiting."
exit 99
fi
# mount/dir test
if [[ $_XMNT -eq 1 ]]; then
if ! mountpoint -q "${FMOUNT}"; then
echo "${FMOUNT} is not a mount point, use -x to override. Exiting."
exit 1
fi
else
# -x was used
if [[ ! -d "${FMOUNT}" ]]; then
echo "${FMOUNT} is not a directory. Exiting."
exit 2
fi
fi
# mkdirs
mkdir -p "${FCACHE}"
if [[ ! -d "${FCACHE}" ]]; then
echo "Cannot create ${FCACHE}. Exiting."
exit 3
fi
}
# ensure we have a fio config
function writeconf() {
# -o was used, or does not exist
if [[ $_OCFG -eq 1 ]] || [[ ! -f "${FCONF}" ]]; then
cat << EOF > "${FCONF}"
;; Generic database simulation
;; - 4k blocks, 5% read, 95% write
;; - threaded mode, 128 request queue depth
;; - fewer large files, random I/O
[4x0595]
; this directory will need numjobs*size free!
directory=${FCACHE}
numjobs=4
size=1G
; run this many loops
loops=10
; instead of loops, run 10 mins
;time_based
;runtime=600
; params for 5/95 read/write randomly
thread
ioengine=libaio
iodepth=128
rw=randrw
rwmixread=5
rwmixwrite=95
randrepeat=0
bs=4k
file_service_type=random
overwrite=1
direct=1
softrandommap=1
random_generator=lfsr
invalidate=1
unlink=0
refill_buffers
group_reporting
EOF
fi
if [[ ! -f "${FCONF}" ]]; then
echo "Cannot create or find ${FCONF}"
exit 2
fi
}
# these could fail and exit
preflight
writeconf
# do the needful
echo "Running: fio --output=${FLOG} ${FCONF}"
echo
fio --output="${FLOG}" "${FCONF}"