#!/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}"