Adding genfio tool : an fio job creator
[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
30MODES="read,write,randread,randwrite"
31SHORT_HOSTNAME=
32
33show_help() {
34 PROG=$(basename $0)
35 echo "usage of $PROG:"
36 cat << EOF
37-h : Show this help & exit
38-a : Run sequential test then parallel one
39-s : Run sequential test (default value)
40 one test after another then one disk after another
41-p : Run parallel test
42 one test after anoter but all disks at the same time
43-d disk1[,disk2,disk3,..] : Run the tests on the selected disks
44 Separated each disk with a comma
45 Disk name shall be "sdxx", /dev/ shall NOT be used here
46-r seconds : Time in seconds per benchmark (300 as default)
47 A simple task is set of 4 benchmarks :
48 read,write,randread,randwrite
49-b blocksize[,blocksize1, ...] : The blocksizes to test under fio format (4k, 1m, ...)
50 Separated each blocksize with a comma
51-m mode1,[mode2,mode3, ...] : Define the fio IO profile to use like read, write, randread, randwrite
52
53Example:
54
55$PROG -d sdb,sdc,sdd,sde -a -b 4k,128k,1m -r 100 -a
56
57 Will generate an fio file that will run
58 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests
59 ETA ~ 4 tests * 4 disks * 100 seconds
60 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests
61 ETA ~ 4 tests * 4 disks * 100 seconds
62 - a sequential bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests
63 ETA ~ 4 tests * 4 disks * 100 seconds
64 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 4k with read,write,randread,randwrite tests
65 ETA ~ 4 tests * 100 seconds
66 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 128k with read,write,randread,randwrite tests
67 ETA ~ 4 tests * 100 seconds
68 - a parallel bench on /dev/sdb /dev/sdc /dev/sdd /dev/sde for block size = 1m with read,write,randread,randwrite tests
69 ETA ~ 4 tests * 100 seconds
70
71Generating localhost-4k,128k,1m-all-read,write,randread,randwrite-sdb,sdc,sdd,sde.fio
72Estimated Time = 6000 seconds : 1 hour 40 minutes
73EOF
74}
75
76gen_template() {
77cat >$TEMPLATE << EOF
78[global]
79ioengine=libaio
80invalidate=1
81runtime=$RUNTIME
82ramp_time=5
83direct=1
84
85EOF
86}
87
88gen_seq_suite() {
89TYPE=$1
90cat >> $OUTFILE << EOF
91[$TYPE-$disk-$BLK_SIZE-seq]
92stonewall
93bs=$BLK_SIZE
94filename=/dev/$disk
95rw=$TYPE
96write_bw_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results
97write_iops_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-seq.results
98EOF
99ETA=$(($ETA + $RUNTIME))
100}
101
102gen_seq_fio() {
103for disk in $(echo $DISKS | tr "," " "); do
104 for mode in $(echo $MODES | tr "," " "); do
105 gen_seq_suite "$mode"
106 done
107done
108}
109
110
111gen_para_suite() {
112TYPE=$1
113NEED_WALL=$2
114D=0
115for disk in $(echo $DISKS | tr "," " "); do
116 cat >> $OUTFILE << EOF
117[$TYPE-$disk-$BLK_SIZE-para]
118bs=$BLK_SIZE
119EOF
120
121if [ "$D" = 0 ]; then
122 echo "stonewall" >> $OUTFILE
123 D=1
124fi
125
126cat >> $OUTFILE << EOF
127filename=/dev/$disk
128rw=$TYPE
129write_bw_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results
130write_iops_log=$SHORT_HOSTNAME-$BLK_SIZE-$disk-$TYPE-para.results
131EOF
132done
133
134ETA=$(($ETA + $RUNTIME))
135echo >> $OUTFILE
136}
137
138gen_para_fio() {
139for mode in $(echo $MODES | tr "," " "); do
140 gen_para_suite "$mode"
141done
142}
143
144gen_fio() {
145case $SEQ in
146 2)
147 gen_seq_fio
148 gen_para_fio
149 ;;
150 1)
151 gen_seq_fio
152 ;;
153 0)
154 gen_para_fio
155 ;;
156esac
157}
158
159parse_cmdline() {
160while getopts "hapsd:b:r:m:" opt; do
161 case $opt in
162 h)
163 show_help
164 exit 0
165 ;;
166 b)
167 BLOCK_SIZE=$OPTARG
168 ;;
169 s)
170 if [ "$SEQ" = "-1" ]; then
171 SEQ=1
172 fi
173 ;;
174 r)
175 RUNTIME=$OPTARG
176 ;;
177 p)
178 if [ "$SEQ" = "-1" ]; then
179 SEQ=0
180 fi
181 ;;
182 m)
183 MODES=$OPTARG;
184 ;;
185 d)
186 DISKS=$OPTARG
187 ;;
188 a)
189 SEQ=2
190 ;;
191 \?)
192 echo "Invalid option: -$OPTARG" >&2
193 ;;
194 esac
195done
196
197if [ "$SEQ" = "-1" ]; then
198 SEQ=0
199fi
200
201SHORT_HOSTNAME=$(hostname -s)
202case $SEQ in
203 2)
204 OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-all-$MODES-$DISKS.fio
205 ;;
206
207 1)
208 OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-sequential-$MODES-$DISKS.fio
209 ;;
210 0)
211 OUTFILE=$SHORT_HOSTNAME-$BLOCK_SIZE-parallel-$MODES-$DISKS.fio
212 ;;
213esac
214
215if [ -z "$DISKS" ]; then
216 echo "Missing DISKS !"
217 echo "Exiting !"
218 exit 1
219fi
220
221}
222
223
224########## MAIN
225parse_cmdline $@
226gen_template
227
228echo "Generating $OUTFILE"
229cp -f $TEMPLATE $OUTFILE
230echo >> $OUTFILE
231
232for BLK_SIZE in $(echo $BLOCK_SIZE | tr "," " "); do
233 gen_fio
234done
235ETA_H=$(($ETA / 3600))
236ETA_M=$((($ETA - ($ETA_H*3600)) / 60))
237echo "Estimated Time = $ETA seconds : $ETA_H hour $ETA_M minutes"