diff --git a/tools/disktest_sysbench.sh b/tools/disktest_sysbench.sh new file mode 100755 index 0000000000..8c2f4cecad --- /dev/null +++ b/tools/disktest_sysbench.sh @@ -0,0 +1,151 @@ +#!/bin/bash +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# $Id$ +# +# Copyright (C) 2020 William Wilgus +################################################################################ +# +# chmod +x disktest_sysbench.sh +# +# apt install sysbench +# +# ./disktest_sysbench.sh /device path filesz(kb) block > ./disklog.txt +# +################################################################################ +echo "Disktest Benchmarking [] $(date)" + +set -uo pipefail +IFS=$'\n\t' + +CMD=$(command -v sysbench) +TESTDURSEC=300 #5 minutes/test +VERBOSITY=5 +BLOCKSZ=('test all' 512 1024 4096 16384 65536 1048576) +THREADS=1 #--validate may fail if threads > 1 (some versions) + +if [ -z "$CMD" ]; then + echo "This script requires 'sysbench' try: 'apt install sysbench' or your system package handler" + exit 1 +else + echo "using sysbench found @ $CMD" + echo "" +fi + +if [ $# -lt 1 ]; then + echo "Usage: $0 , " + exit 1 +fi + +DEV_DIR=$1 +TEST_PATH="$DEV_DIR/disktest_sysbench" +SIZEKB=${2:-'10*1024'} #10Mb file [default] +SIZEBYTE=$((SIZEKB*1024)) +BLOCK=${3:-5} #65535 default +if (($BLOCK > ${#BLOCKSZ[@]})) ;then + $BLOCK = 0 +fi + +BeginDiskTest() { + local start=$BLOCK + local blocks=$BLOCK+1 + local bs=0 + local cwd="/" + local filenum=0 + local sysbench_cmd + local out + + if (( blocks == 1 )) ;then + start=1 + blocks=${#BLOCKSZ[@]} + fi + + for (( b=$start; b<$blocks; b++ )) + do + bs=${BLOCKSZ[b]} + filenum=$(( SIZEBYTE / bs )) + # note try bigger block sizes if you run out of file handles + if (( $(ulimit -Sn ) < $(($filenum + 100)) )) ;then + local hard=$(ulimit -Hn) #get hard limit + echo attempting to increase soft file limit to $hard + ulimit -Sn $hard + fi +################################################################################ + sysbench_cmd=(fileio --validate --file-total-size=$SIZEBYTE --file-block-size=$bs --file-num=$filenum --threads=$THREADS --max-requests=0 --time=$TESTDURSEC --file-extra-flags=direct --verbosity=$VERBOSITY --file-fsync-all=on) + echo "--------------------------------------------------------------------------------" + echo "Command Lines to be executed:" + echo "--------------------------------------------------------------------------------" + echo "Test Prep:" + echo ${CMD##*/} " fileio --file-total-size=$SIZEBYTE --file-block-size=$bs --file-num=$filenum prepare" + echo "" + echo "Sequential Write:" + echo ${CMD##*/} "${sysbench_cmd[@]}" --file-test-mode=seqwr run + echo "" + echo "Random R/W:" + echo ${CMD##*/} "${sysbench_cmd[@]}" --file-test-mode=rndrw run + echo "" + echo "Sequential Read:" + echo ${CMD##*/} "${sysbench_cmd[@]}" --file-test-mode=seqrd run + echo "--------------------------------------------------------------------------------" + echo "" +################################################################################ + echo "Preparing ${filenum} files, ${SIZEKB}KB file Block Size: ${BLOCKSZ[b]}B..." + $CMD fileio --file-total-size=$SIZEBYTE --file-block-size=$bs --file-num=$filenum --verbosity=0 prepare + echo "" + echo "--------------------------------------------------------------------------------" + echo "SEQUENTIAL WRITE [$DEV_DIR] BLOCK SIZE: $bs" + echo "--------------------------------------------------------------------------------" + echo "" + out=$($CMD "${sysbench_cmd[@]}" --file-test-mode=seqwr run 2>&1) #exec command + printf "%s\n" "${out#*Threads started!}" + echo "--------------------------------------------------------------------------------" + echo "" + echo "--------------------------------------------------------------------------------" + echo "RANDOM WRITE/READ [$DEV_DIR] BLOCK SIZE: $bs" + echo "--------------------------------------------------------------------------------" + out=$("$CMD" "${sysbench_cmd[@]}" --file-test-mode=rndrw run 2>&1) #exec command + printf "%s\n" "${out#*Threads started!}" + echo "--------------------------------------------------------------------------------" + echo "" + echo "--------------------------------------------------------------------------------" + echo "SEQUENTIAL READ [$DEV_DIR] BLOCK SIZE: $bs" + echo "--------------------------------------------------------------------------------" + out=$("$CMD" "${sysbench_cmd[@]}" --file-test-mode=seqrd run 2>&1) #exec command + printf "%s\n" "${out#*Threads started!}" + echo "--------------------------------------------------------------------------------" + done + echo "--------------------------------------------------------------------------------" + echo "Finished [$DEV_DIR] $(date)" + echo "--------------------------------------------------------------------------------" +} +################################################################################ +echo "Device Filepath: $1" +echo "Testfile Folder: $TEST_PATH" +echo "Filesize: $SIZEKB kB" +echo "Blocksize (bytes): ${BLOCKSZ[BLOCK]}" +echo "Test Duration (SEC) $TESTDURSEC Each" +echo "Tests: Random R/W, Sequential Write, Sequential Read" +echo "" +echo "Ready to create test files on device @ $TEST_PATH" +echo Continue Y/n? +read prompt +if [ "$prompt" != "${prompt#[Yy]}" ] ;then + [ -d $TEST_PATH ] || mkdir $TEST_PATH + cd "$TEST_PATH" + cwd=$(pwd -P) + if [ "$cwd" = "$TEST_PATH" ] ;then + BeginDiskTest + else + echo "couldn't cd to device directory " + exit 2 + fi +else + echo "exiting" + exit 0 +fi + +exit 0