Merge branch 'histograms-PR' of https://github.com/cronburg/fio
[fio.git] / tools / genfio
index 6d3220daf1a4d93568a20f5950272a8f1198ac37..68004520a164cd0db7f22c70ca412550888a4f0a 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 #  Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
 #  Author: Erwan Velu  <erwan@enovance.com>
@@ -25,6 +25,7 @@ SEQ=-1
 TEMPLATE=/tmp/template.fio
 OUTFILE=
 DISKS=
+PRINTABLE_DISKS=
 RUNTIME=300
 ETA=0
 MODES="write,randwrite,read,randread"
@@ -50,25 +51,28 @@ show_help() {
                                        one test after anoter but all disks at the same time
                                        Enabled by default
 -D iodepth                     : Run with the specified iodepth
-                                       Default is 32
+                                       Default is $IODEPTH
 -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
+-z filesize                     : Specify the working file size, if you are passing filepaths to -d
+                                        Disabled by default
 -r seconds                     : Time in seconds per benchmark
                                        0 means till the end of the device
-                                       Default is 300 seconds
+                                       Default is $RUNTIME seconds
 -b blocksize[,blocksize1, ...]  : The blocksizes to test under fio format (4k, 1m, ...)
                                        Separated each blocksize with a comma
-                                       Default is 4k
+                                       Default is $BLOCK_SIZE
 -m mode1,[mode2,mode3, ...]     : Define the fio IO profile to use like read, write, randread, randwrite
-                                       Default is "write,randwrite,read,randread"
+                                       Default is "$MODES"
 -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
+-A cmd_to_run                  : System command to run after each job (exec_postrun in fio)
+-B cmd_to_run                  : System command to run before each job (exec_prerun in fio)
 
 Example:
 
-$PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a -x dellr720-day2/
+$PROG -d /dev/sdb,/dev/sdc,/dev/sdd,/dev/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 write,randwrite,read,randread tests
@@ -89,40 +93,55 @@ Estimated Time = 6000 seconds : 1 hour 40 minutes
 EOF
 }
 
-gen_template() {
-cat >$TEMPLATE << EOF
-[global]
-ioengine=libaio
-iodepth=$IODEPTH
-invalidate=1
-ramp_time=5
-EOF
+finish_template() {
+echo "iodepth=$IODEPTH" >> $TEMPLATE
 
 if [ "$RUNTIME" != "0" ]; then
-cat >>$TEMPLATE << EOF
-runtime=$RUNTIME
-time_based
-EOF
+       echo "runtime=$RUNTIME" >> $TEMPLATE
+       echo "time_based" >> $TEMPLATE
 fi
 
 if [ "$CACHED_IO" = "FALSE" ]; then
-cat >>$TEMPLATE << EOF
-direct=1
-EOF
+       echo "direct=1" >> $TEMPLATE
 fi
+}
+
+
+diskname_to_printable() {
+COUNT=0
+for disk in $(echo $@ | tr "," " "); do
+       R=$(basename $disk | sed 's|/|_|g')
+       COUNT=$(($COUNT + 1))
+       if [ $COUNT -eq 1 ]; then
+               P="$R"
+       else
+               P="$P,$R"
+       fi
+done
+echo $P
+}
 
+gen_template() {
+cat >$TEMPLATE << EOF
+[global]
+ioengine=libaio
+invalidate=1
+ramp_time=5
+EOF
 }
 
 gen_seq_suite() {
 TYPE=$1
+disk=$2
+PRINTABLE_DISK=$(diskname_to_printable $disk)
 cat >> $OUTFILE << EOF
-[$TYPE-$disk-$BLK_SIZE-seq]
+[$TYPE-$PRINTABLE_DISK-$BLK_SIZE-seq]
 stonewall
 bs=$BLK_SIZE
-filename=/dev/$disk
+filename=$disk
 rw=$TYPE
-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
+write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-seq.results
+write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-seq.results
 EOF
 ETA=$(($ETA + $RUNTIME))
 }
@@ -130,7 +149,7 @@ ETA=$(($ETA + $RUNTIME))
 gen_seq_fio() {
 for disk in $(echo $DISKS | tr "," " "); do
        for mode in $(echo $MODES | tr "," " "); do
-               gen_seq_suite "$mode"
+               gen_seq_suite "$mode" "$disk"
        done
 done
 }
@@ -141,8 +160,9 @@ TYPE=$1
 NEED_WALL=$2
 D=0
 for disk in $(echo $DISKS | tr "," " "); do
+    PRINTABLE_DISK=$(diskname_to_printable $disk)
     cat >> $OUTFILE << EOF
-[$TYPE-$disk-$BLK_SIZE-para]
+[$TYPE-$PRINTABLE_DISK-$BLK_SIZE-para]
 bs=$BLK_SIZE
 EOF
 
@@ -152,10 +172,10 @@ if [ "$D" = 0 ]; then
 fi
 
 cat >> $OUTFILE << EOF
-filename=/dev/$disk
+filename=$disk
 rw=$TYPE
-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
+write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-para.results
+write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$PRINTABLE_DISK-$TYPE-para.results
 EOF
 done
 
@@ -185,7 +205,7 @@ esac
 }
 
 parse_cmdline() {
-while getopts "hacpsd:b:r:m:x:D:" opt; do
+while getopts "hacpsd:b:r:m:x:z:D:A:B:" opt; do
   case $opt in
     h)
        show_help
@@ -228,6 +248,7 @@ while getopts "hacpsd:b:r:m:x:D:" opt; do
       ;;
     d)
        DISKS=$OPTARG
+       PRINTABLE_DISKS=$(diskname_to_printable "$DISKS")
       ;;
     D)
        IODEPTH=$OPTARG
@@ -235,6 +256,16 @@ while getopts "hacpsd:b:r:m:x:D:" opt; do
     a)
        SEQ=2
       ;;
+    B)
+       echo "exec_prerun=$OPTARG" >> $TEMPLATE
+      ;;
+    A)
+       echo "exec_postrun=$OPTARG" >> $TEMPLATE
+      ;;
+    z)
+       FSIZE=$OPTARG
+       echo "size=$FSIZE" >> $TEMPLATE
+      ;;
     \?)
       echo "Invalid option: -$OPTARG" >&2
       ;;
@@ -248,14 +279,14 @@ fi
 SHORT_HOSTNAME=$(hostname -s)
 case $SEQ in
        2)
-               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$DISKS.fio
+               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$PRINTABLE_DISKS.fio
        ;;
 
        1)
-               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$DISKS.fio
+               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$PRINTABLE_DISKS.fio
        ;;
        0)
-               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$DISKS.fio
+               OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$PRINTABLE_DISKS.fio
        ;;
 esac
 
@@ -303,9 +334,10 @@ done
 
 
 ########## MAIN
-parse_cmdline $@
-check_mode_order
 gen_template
+parse_cmdline "$@"
+finish_template
+check_mode_order
 
 echo "Generating $OUTFILE"
 cp -f $TEMPLATE $OUTFILE