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}"
+