X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=tools%2Fgenfio;h=123f6e42a6025fbff8f84483b0c5cb3a34524de5;hp=efc87a29514c72a48c54ff75baa1092c6c919e38;hb=60238f0e7c8bb689f31e3871a661741f2c5fd583;hpb=72fe3ef10c1911b6f9ec84af99ba6f97112e216b diff --git a/tools/genfio b/tools/genfio index efc87a29..123f6e42 100755 --- a/tools/genfio +++ b/tools/genfio @@ -27,47 +27,61 @@ OUTFILE= DISKS= RUNTIME=300 ETA=0 -MODES="read,write,randread,randwrite" +MODES="write,randwrite,read,randread" SHORT_HOSTNAME= +CACHED_IO="FALSE" +PREFIX="" +PREFIX_FILENAME="" show_help() { PROG=$(basename $0) echo "usage of $PROG:" cat << EOF -h : Show this help & exit +-c : Enable cached-based IOs + Disabled by default -a : Run sequential test then parallel one + Disabled by default -s : Run sequential test (default value) one test after another then one disk after another + Disabled by default -p : Run parallel test one test after anoter but all disks at the same time + Enabled by default -d disk1[,disk2,disk3,..] : Run the tests on the selected disks Separated each disk with a comma Disk name shall be "sdxx", /dev/ shall NOT be used here --r seconds : Time in seconds per benchmark (300 as default) +-r seconds : Time in seconds per benchmark 0 means till the end of the device + Default is 300 seconds -b blocksize[,blocksize1, ...] : The blocksizes to test under fio format (4k, 1m, ...) Separated each blocksize with a comma + Default is 4k -m mode1,[mode2,mode3, ...] : Define the fio IO profile to use like read, write, randread, randwrite + Default is "write,randwrite,read,randread" +-x prefix : Add a prefix to the fio filename + Useful to let a context associated with the file + If the prefix features a / (slash), prefix will be considered as a directory Example: -$PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a +$PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a -x dellr720-day2/ Will generate an fio file that will run - - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests + - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests ETA ~ 4 tests * 4 disks * 100 seconds - - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests + - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests ETA ~ 4 tests * 4 disks * 100 seconds - - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests + - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests ETA ~ 4 tests * 4 disks * 100 seconds - - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests + - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests ETA ~ 4 tests * 100 seconds - - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests + - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests ETA ~ 4 tests * 100 seconds - - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests + - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests ETA ~ 4 tests * 100 seconds -Generating localhost-4k,128k,1m-all-read,write,randread,randwrite-sdb,sdc,sdd,sde.fio +Generating dellr720-day2/localhost-4k,128k,1m-all-write,randwrite,read,randread-sdb,sdc,sdd,sde.fio Estimated Time = 6000 seconds : 1 hour 40 minutes EOF } @@ -78,7 +92,6 @@ cat >$TEMPLATE << EOF ioengine=libaio invalidate=1 ramp_time=5 -direct=1 EOF if [ "$RUNTIME" != "0" ]; then @@ -87,6 +100,12 @@ runtime=$RUNTIME EOF fi +if [ "$CACHED_IO" = "FALSE" ]; then +cat >>$TEMPLATE << EOF +direct=1 +EOF +fi + } gen_seq_suite() { @@ -97,8 +116,8 @@ stonewall bs=$BLK_SIZE filename=/dev/$disk rw=$TYPE -write_bw_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results -write_iops_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results +write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results +write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results EOF ETA=$(($ETA + $RUNTIME)) } @@ -130,8 +149,8 @@ fi cat >> $OUTFILE << EOF filename=/dev/$disk rw=$TYPE -write_bw_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results -write_iops_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results +write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results +write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results EOF done @@ -161,7 +180,7 @@ esac } parse_cmdline() { -while getopts "hapsd:b:r:m:" opt; do +while getopts "hacpsd:b:r:m:x:" opt; do case $opt in h) show_help @@ -170,11 +189,27 @@ while getopts "hapsd:b:r:m:" opt; do b) BLOCK_SIZE=$OPTARG ;; + c) + CACHED_IO="TRUE" + ;; s) if [ "$SEQ" = "-1" ]; then SEQ=1 fi ;; + x) + PREFIX=$OPTARG + echo "$PREFIX" | grep -q "/" + if [ "$?" -eq 0 ]; then + mkdir -p $PREFIX + # No need to keep the prefix for the log files + # we do have a directory for that + PREFIX_FILENAME="" + else + # We need to keep the prefix for the log files + PREFIX_FILENAME=$PREFIX + fi + ;; r) RUNTIME=$OPTARG ;; @@ -205,28 +240,63 @@ fi SHORT_HOSTNAME=$(hostname -s) case $SEQ in 2) - OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$DISKS.fio + OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$DISKS.fio ;; 1) - OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$DISKS.fio + OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$DISKS.fio ;; 0) - OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$DISKS.fio + OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$DISKS.fio ;; esac if [ -z "$DISKS" ]; then echo "Missing DISKS !" - echo "Exiting !" + echo "Please read the help !" + show_help exit 1 fi } +check_mode_order() { +FOUND_WRITE="NO" +CAUSE="You are reading data before writing them " + +# If no write occurs, let's show a different message +echo $MODES | grep -q "write" +if [ "$?" -ne 0 ]; then + CAUSE="You are reading data while never wrote them before" +fi + +for mode in $(echo $MODES | tr "," " "); do + echo $mode | grep -q write + if [ "$?" -eq 0 ]; then + FOUND_WRITE="YES" + fi + echo $mode | grep -q "read" + if [ "$?" -eq 0 ]; then + if [ "$FOUND_WRITE" = "NO" ]; then + echo "###############################################################" + echo "# Warning : $CAUSE#" + echo "# On some storage devices, this could lead to invalid results #" + echo "# #" + echo "# Press Ctrl-C to adjust pattern order if you have doubts #" + echo "# Or Wait 5 seconds before the file will be created #" + echo "###############################################################" + sleep 5 + # No need to try showing the message more than one time + return + fi + fi +done +} + ########## MAIN parse_cmdline $@ +check_mode_order gen_template echo "Generating $OUTFILE" @@ -238,7 +308,7 @@ for BLK_SIZE in $(echo $BLOCK_SIZE | tr "," " "); do done ETA_H=$(($ETA / 3600)) ETA_M=$((($ETA - ($ETA_H*3600)) / 60)) -if [ "$ETA_M" = "0" ]; then +if [ "$ETA" = "0" ]; then echo "Cannot estimate ETA as RUNTIME=0" else echo "Estimated Time = $ETA seconds : $ETA_H hour $ETA_M minutes"