genfio: Adding iodepth support
[fio.git] / tools / genfio
CommitLineData
afbbd646
EV
1#!/bin/bash
2#
3# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
4# Author: Erwan Velu <erwan@enovance.com>
5#
6# The license below covers all files distributed with fio unless otherwise
7# noted in the file itself.
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License version 2 as
11# published by the Free Software Foundation.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
22BLK_SIZE=
23BLOCK_SIZE=4k
24SEQ=-1
25TEMPLATE=/tmp/template.fio
26OUTFILE=
27DISKS=
28RUNTIME=300
29ETA=0
60238f0e 30MODES="write,randwrite,read,randread"
afbbd646 31SHORT_HOSTNAME=
76c7c63e 32CACHED_IO="FALSE"
a7419837
EV
33PREFIX=""
34PREFIX_FILENAME=""
7d1ca6cf 35IODEPTH=1
afbbd646
EV
36
37show_help() {
38 PROG=$(basename $0)
39 echo "usage of $PROG:"
40 cat << EOF
41-h : Show this help & exit
76c7c63e 42-c : Enable cached-based IOs
e1c6f2e1 43 Disabled by default
afbbd646 44-a : Run sequential test then parallel one
e1c6f2e1 45 Disabled by default
afbbd646
EV
46-s : Run sequential test (default value)
47 one test after another then one disk after another
e1c6f2e1 48 Disabled by default
afbbd646
EV
49-p : Run parallel test
50 one test after anoter but all disks at the same time
e1c6f2e1 51 Enabled by default
7d1ca6cf
EV
52-D iodepth : Run with the specified iodepth
53 Default is 32
afbbd646
EV
54-d disk1[,disk2,disk3,..] : Run the tests on the selected disks
55 Separated each disk with a comma
56 Disk name shall be "sdxx", /dev/ shall NOT be used here
e1c6f2e1 57-r seconds : Time in seconds per benchmark
72fe3ef1 58 0 means till the end of the device
e1c6f2e1 59 Default is 300 seconds
afbbd646
EV
60-b blocksize[,blocksize1, ...] : The blocksizes to test under fio format (4k, 1m, ...)
61 Separated each blocksize with a comma
e1c6f2e1 62 Default is 4k
afbbd646 63-m mode1,[mode2,mode3, ...] : Define the fio IO profile to use like read, write, randread, randwrite
60238f0e 64 Default is "write,randwrite,read,randread"
a7419837
EV
65-x prefix : Add a prefix to the fio filename
66 Useful to let a context associated with the file
67 If the prefix features a / (slash), prefix will be considered as a directory
afbbd646
EV
68
69Example:
70
a7419837 71$PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a -x dellr720-day2/
afbbd646
EV
72
73 Will generate an fio file that will run
60238f0e 74 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
afbbd646 75 ETA ~ 4 tests * 4 disks * 100 seconds
60238f0e 76 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
afbbd646 77 ETA ~ 4 tests * 4 disks * 100 seconds
60238f0e 78 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
afbbd646 79 ETA ~ 4 tests * 4 disks * 100 seconds
60238f0e 80 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with write,randwrite,read,randread tests
afbbd646 81 ETA ~ 4 tests * 100 seconds
60238f0e 82 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with write,randwrite,read,randread tests
afbbd646 83 ETA ~ 4 tests * 100 seconds
60238f0e 84 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with write,randwrite,read,randread tests
afbbd646
EV
85 ETA ~ 4 tests * 100 seconds
86
60238f0e 87Generating dellr720-day2/localhost-4k,128k,1m-all-write,randwrite,read,randread-sdb,sdc,sdd,sde.fio
afbbd646
EV
88Estimated Time = 6000 seconds : 1 hour 40 minutes
89EOF
90}
91
92gen_template() {
93cat >$TEMPLATE << EOF
94[global]
95ioengine=libaio
7d1ca6cf 96iodepth=$IODEPTH
afbbd646 97invalidate=1
afbbd646 98ramp_time=5
72fe3ef1 99EOF
afbbd646 100
72fe3ef1
EV
101if [ "$RUNTIME" != "0" ]; then
102cat >>$TEMPLATE << EOF
103runtime=$RUNTIME
afbbd646 104EOF
72fe3ef1
EV
105fi
106
76c7c63e
EV
107if [ "$CACHED_IO" = "FALSE" ]; then
108cat >>$TEMPLATE << EOF
109direct=1
110EOF
111fi
112
afbbd646
EV
113}
114
115gen_seq_suite() {
116TYPE=$1
117cat >> $OUTFILE << EOF
118[$TYPE-$disk-$BLK_SIZE-seq]
119stonewall
120bs=$BLK_SIZE
121filename=/dev/$disk
122rw=$TYPE
a7419837
EV
123write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results
124write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results
afbbd646
EV
125EOF
126ETA=$(($ETA + $RUNTIME))
127}
128
129gen_seq_fio() {
130for disk in $(echo $DISKS | tr "," " "); do
131 for mode in $(echo $MODES | tr "," " "); do
132 gen_seq_suite "$mode"
133 done
134done
135}
136
137
138gen_para_suite() {
139TYPE=$1
140NEED_WALL=$2
141D=0
142for disk in $(echo $DISKS | tr "," " "); do
143 cat >> $OUTFILE << EOF
144[$TYPE-$disk-$BLK_SIZE-para]
145bs=$BLK_SIZE
146EOF
147
148if [ "$D" = 0 ]; then
149 echo "stonewall" >> $OUTFILE
150 D=1
151fi
152
153cat >> $OUTFILE << EOF
154filename=/dev/$disk
155rw=$TYPE
a7419837
EV
156write_bw_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results
157write_iops_log=${PREFIX_FILENAME}$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results
afbbd646
EV
158EOF
159done
160
161ETA=$(($ETA + $RUNTIME))
162echo >> $OUTFILE
163}
164
165gen_para_fio() {
166for mode in $(echo $MODES | tr "," " "); do
167 gen_para_suite "$mode"
168done
169}
170
171gen_fio() {
172case $SEQ in
173 2)
174 gen_seq_fio
175 gen_para_fio
176 ;;
177 1)
178 gen_seq_fio
179 ;;
180 0)
181 gen_para_fio
182 ;;
183esac
184}
185
186parse_cmdline() {
7d1ca6cf 187while getopts "hacpsd:b:r:m:x:D:" opt; do
afbbd646
EV
188 case $opt in
189 h)
190 show_help
191 exit 0
192 ;;
193 b)
194 BLOCK_SIZE=$OPTARG
195 ;;
76c7c63e
EV
196 c)
197 CACHED_IO="TRUE"
198 ;;
afbbd646
EV
199 s)
200 if [ "$SEQ" = "-1" ]; then
201 SEQ=1
202 fi
203 ;;
a7419837
EV
204 x)
205 PREFIX=$OPTARG
206 echo "$PREFIX" | grep -q "/"
207 if [ "$?" -eq 0 ]; then
208 mkdir -p $PREFIX
209 # No need to keep the prefix for the log files
210 # we do have a directory for that
211 PREFIX_FILENAME=""
212 else
213 # We need to keep the prefix for the log files
214 PREFIX_FILENAME=$PREFIX
215 fi
216 ;;
afbbd646
EV
217 r)
218 RUNTIME=$OPTARG
219 ;;
220 p)
221 if [ "$SEQ" = "-1" ]; then
222 SEQ=0
223 fi
224 ;;
225 m)
226 MODES=$OPTARG;
227 ;;
228 d)
229 DISKS=$OPTARG
230 ;;
7d1ca6cf
EV
231 D)
232 IODEPTH=$OPTARG
233 ;;
afbbd646
EV
234 a)
235 SEQ=2
236 ;;
237 \?)
238 echo "Invalid option: -$OPTARG" >&2
239 ;;
240 esac
241done
242
243if [ "$SEQ" = "-1" ]; then
244 SEQ=0
245fi
246
247SHORT_HOSTNAME=$(hostname -s)
248case $SEQ in
249 2)
a7419837 250 OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$DISKS.fio
afbbd646
EV
251 ;;
252
253 1)
a7419837 254 OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$DISKS.fio
afbbd646
EV
255 ;;
256 0)
a7419837 257 OUTFILE=${PREFIX}$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$DISKS.fio
afbbd646
EV
258 ;;
259esac
260
261if [ -z "$DISKS" ]; then
262 echo "Missing DISKS !"
e1c6f2e1
EV
263 echo "Please read the help !"
264 show_help
afbbd646
EV
265 exit 1
266fi
267
268}
269
60238f0e
EV
270check_mode_order() {
271FOUND_WRITE="NO"
272CAUSE="You are reading data before writing them "
273
274# If no write occurs, let's show a different message
275echo $MODES | grep -q "write"
276if [ "$?" -ne 0 ]; then
277 CAUSE="You are reading data while never wrote them before"
278fi
279
280for mode in $(echo $MODES | tr "," " "); do
281 echo $mode | grep -q write
282 if [ "$?" -eq 0 ]; then
283 FOUND_WRITE="YES"
284 fi
285 echo $mode | grep -q "read"
286 if [ "$?" -eq 0 ]; then
287 if [ "$FOUND_WRITE" = "NO" ]; then
288 echo "###############################################################"
289 echo "# Warning : $CAUSE#"
290 echo "# On some storage devices, this could lead to invalid results #"
291 echo "# #"
292 echo "# Press Ctrl-C to adjust pattern order if you have doubts #"
293 echo "# Or Wait 5 seconds before the file will be created #"
294 echo "###############################################################"
295 sleep 5
296 # No need to try showing the message more than one time
297 return
298 fi
299 fi
300done
301}
302
afbbd646
EV
303
304########## MAIN
305parse_cmdline $@
60238f0e 306check_mode_order
afbbd646
EV
307gen_template
308
309echo "Generating $OUTFILE"
310cp -f $TEMPLATE $OUTFILE
311echo >> $OUTFILE
312
313for BLK_SIZE in $(echo $BLOCK_SIZE | tr "," " "); do
314 gen_fio
315done
316ETA_H=$(($ETA / 3600))
317ETA_M=$((($ETA - ($ETA_H*3600)) / 60))
af360e39 318if [ "$ETA" = "0" ]; then
72fe3ef1
EV
319 echo "Cannot estimate ETA as RUNTIME=0"
320else
321 echo "Estimated Time = $ETA seconds : $ETA_H hour $ETA_M minutes"
322fi