From 86ffd0cdee33959a669dfd96542fbf9bbf0448e5 Mon Sep 17 00:00:00 2001 From: tengel Date: Wed, 20 Mar 2024 09:31:35 -0500 Subject: [PATCH] adding 5/95 r/w variant --- fiotest_4x0595.sh | 156 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100755 fiotest_4x0595.sh diff --git a/fiotest_4x0595.sh b/fiotest_4x0595.sh new file mode 100755 index 0000000..12a4190 --- /dev/null +++ b/fiotest_4x0595.sh @@ -0,0 +1,156 @@ +#!/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 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}" +