156 lines
3.2 KiB
Bash
Executable file
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}"
|
|
|