Whamcloud - gitweb
LU-3285 mds: combine DoM bit with other IBITS
[fs/lustre-release.git] / lustre / tests / dom-performance.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6
7 set -e
8
9 ONLY=${ONLY:-"$*"}
10 ALWAYS_EXCEPT=""
11 [ "$SLOW" = "no" ] && EXCEPT_SLOW=""
12 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
13
14 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
15
16 . $LUSTRE/tests/test-framework.sh
17 CLEANUP=${CLEANUP:-:}
18 SETUP=${SETUP:-:}
19 init_test_env $@
20 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
21 init_logging
22
23 FAIL_ON_ERROR=false
24
25 check_and_setup_lustre
26
27 # $RUNAS_ID may get set incorrectly somewhere else
28 if [[ $UID -eq 0 && $RUNAS_ID -eq 0 ]]; then
29         skip_env "\$RUNAS_ID set to 0, but \$UID is also 0!" && exit
30 fi
31 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
32
33 build_test_filter
34
35 DOM="yes"
36 DOM_SIZE=${DOM_SIZE:-"1M"}
37 OSC="mdc"
38
39 rm -rf $DIR/*
40
41 NORM=$DIR/norm
42 DOM=$DIR/dom
43 STATS=${STATS:-"yes"}
44
45 # 1 stripe for normal files
46 mkdir -p $NORM
47 lfs setstripe -c 1 $NORM
48
49 if [ "x$DNE" == "xyes" ] ; then
50         lfs setdirstripe -i 0 -c 2 $DOM
51 else
52         mkdir -p $DOM
53 fi
54
55 lfs setstripe -E ${DOM_SIZE} -L mdt -E EOF $DOM
56
57 # total number of files
58 FNUM=16384
59 # number of threads
60 NUM=4
61
62 clear_stats() {
63         local cli=$1
64
65         $LCTL set_param -n ${cli}.*.${cli}_stats=0
66         $LCTL set_param -n ${cli}.*.rpc_stats=0
67         $LCTL set_param -n ${cli}.*.stats=0
68         $LCTL set_param -n llite.*.read_ahead_stats=0
69         $LCTL set_param -n llite.*.unstable_stats=0
70 }
71
72 collect_stats() {
73         local cli=$1
74
75         sync;sync
76
77         if [ "x$STATS" != "xyes" ] ; then
78                 return 0
79         fi
80
81         $LCTL get_param ${cli}.*.${cli}_stats
82         $LCTL get_param ${cli}.*.rpc_stats
83         # for OSC get both OSC and MDC stats
84         if [ $cli == "osc" ] ; then
85                 $LCTL get_param mdc.*.stats
86         fi
87         $LCTL get_param ${cli}.*.stats
88         $LCTL get_param ${cli}.*.unstable_stats
89         $LCTL get_param ${cli}.*.${cli}_cached_mb
90         $LCTL get_param llite.*.read_ahead_stats
91 }
92
93 setup_test() {
94         local cli=$1
95
96         cancel_lru_locks $cli
97         ### drop all debug
98         $LCTL set_param -n debug=0
99         clear_stats $cli
100 }
101
102 run_cmd() {
103         local cmd=$1
104
105         setup_test $OSC
106         if ! grep -qw "$MOUNT" /proc/mounts ; then
107                 echo "!!!!! Lustre is not mounted !!!!!, aborting"
108                 return 0
109         fi
110
111         echo "##### $cmd #####"
112         echo "##### $(date +'%F %H:%M:%S'): START"
113         eval $cmd
114         echo "##### $(date +'%F %H:%M:%S'): GETSTATS"
115         collect_stats $OSC
116         echo "##### $(date +'%F %H:%M:%S'): STOP"
117         remount_client $DIR
118
119 }
120
121 run_MDtest() {
122         if ! which mdtest > /dev/null 2>&1 ; then
123                 echo "Mdtest is not installed, skipping"
124                 return 0
125         fi
126
127         local mdtest=$(which mdtest)
128
129         local TDIR=${1:-$MOUNT}
130         local th_num=$((FNUM * 2 / NUM))
131
132         for bsize in 4096 ; do
133                 run_cmd "mpirun -np $NUM $mdtest \
134                          -i 3 -I $th_num -F -z 1 -b 1 -L -u -w $bsize -d $TDIR"
135         done
136         rm -rf $TDIR/*
137         return 0
138 }
139
140 run_smalliomany() {
141         if [ ! -f createmany ] ; then
142                 echo "Createmany is not installed, skipping"
143                 return 0
144         fi
145
146         if [ ! -f smalliomany ] ; then
147                 echo "Smalliomany is not installed, skipping"
148                 return 0
149         fi
150
151         local TDIR=${1:-$DIR}
152         local count=$FNUM
153
154         local MIN=$((count * 16))
155         [ $MDSSIZE -le $MIN ] && count=$((MDSSIZE / 16))
156
157         run_cmd "./createmany -o $TDIR/file- $count | grep 'total'"
158
159         if [ -f statmany ]; then
160                 run_cmd "./statmany -s $TDIR/file- $count $((count * 5)) | \
161                         grep 'total'"
162         fi
163
164         for opc in w a r ; do
165                 run_cmd "./smalliomany -${opc} $TDIR/file- $count 300 | \
166                         grep 'total'"
167         done
168
169         run_cmd "./unlinkmany $TDIR/file- $count | grep 'total'"
170         return 0
171 }
172
173 run_IOR() {
174         if ! which IOR > /dev/null 2>&1 ; then
175                 echo "IOR is not installed, skipping"
176                 return 0
177         fi
178
179         local IOR=$(which IOR)
180         local iter=$((FNUM / NUM))
181
182         if [ "x$DIO" == "xyes" ] ; then
183                 direct="-B"
184         else
185                 direct=""
186         fi
187
188         local TDIR=${1:-$MOUNT}
189
190         for bsize in 4 ; do
191                 segments=$((128 / bsize))
192
193                 run_cmd "mpirun -np $NUM $IOR \
194                         -a POSIX -b ${bsize}K -t ${bsize}K -o $TDIR/ -k \
195                         -s $segments -w -r -i $iter -F -E -z -m -Z $direct"
196                 # check READ performance only (no cache)
197                 run_cmd "mpirun -np $NUM $IOR \
198                         -a POSIX -b ${bsize}K -t ${bsize}K -o $TDIR/ -X 42\
199                         -s $segments -r -i $iter -F -E -z -m -Z $direct"
200         done
201         rm -rf $TDIR/*
202         return 0
203 }
204
205 run_dbench() {
206         if ! which dbench > /dev/null 2>&1 ; then
207                 echo "Dbench is not installed, skipping"
208                 return 0
209         fi
210
211         if [ "x$DNE" == "xyes" ] ; then
212                 echo "dbench uses subdirs, skipping for DNE setup"
213                 return 0
214         fi
215
216         local TDIR=${1:-$MOUNT}
217
218         run_cmd "dbench -D $TDIR $NUM | egrep -v 'warmup|execute'"
219         rm -rf $TDIR/*
220         return 0
221 }
222
223 run_smallfile() {
224         if ! which unzip > /dev/null 2>&1 ; then
225                 echo "No unzip is installed, skipping"
226                 return 0;
227         fi
228
229         if [ "x$DIO" == "xyes" ] ; then
230                 echo "smallfile has no DIRECT IO mode, skipping"
231                 return 0
232         fi
233
234         if [ "x$DNE" == "xyes" ] ; then
235                 echo "smallfile uses subdirs, skipping for DNE setup"
236                 return 0
237         fi
238
239         local host_set=$(hostname)
240
241         ### since smallfile is not installed system wide, get it right now
242         [ -f master.zip ] || \
243                 wget https://github.com/bengland2/smallfile/archive/master.zip
244         unzip -uo master.zip
245         cd ./smallfile-master
246
247         if ! ls ./smallfile_cli.py > /dev/null 2>&1 ; then
248                 echo "No smallfile test found, skipping"
249                 cd ..
250                 return 0
251         fi
252
253         local TDIR=${1:-$MOUNT}
254         local thrds=$NUM
255         local fsize=64 # in Kbytes
256         local total=$FNUM # files in test
257         local fnum=$((total / NUM))
258
259         SYNC_DIR=${MOUNT}/sync
260         mkdir -p $SYNC_DIR
261
262         SMF="./smallfile_cli.py --pause 10 --host-set $host_set \
263              --response-times Y --threads $thrds --file-size $fsize \
264              --files $fnum --top $TDIR --network-sync-dir $SYNC_DIR \
265              --file-size-distribution exponential"
266
267         run_cmd "$SMF --operation create"
268
269         for oper in read append overwrite ; do
270                 for bsize in 8 ; do
271                         run_cmd "$SMF --record-size $bsize --operation $oper"
272                 done
273         done
274         run_cmd "$SMF --operation delete"
275
276         rm -rf $TDIR/*
277         cd ..
278         return 0
279 }
280
281 test_smallio() {
282         OSC="mdc"
283         run_smalliomany $DOM
284         echo "### Data-on-MDT files, no IO lock on open ###"
285         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=0
286         OSC="mdc"
287         run_smalliomany $DOM
288         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=1
289         OSC="osc"
290         run_smalliomany $NORM
291 }
292 run_test smallio "Performance comparision: smallio"
293
294 test_mdtest() {
295         OSC="mdc"
296         run_MDtest $DOM
297         echo "### Data-on-MDT files, NO IO lock on open ###"
298         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=0
299         OSC="mdc"
300         run_MDtest $DOM
301         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=1
302         echo "### Normal files, $OSTCOUNT OSTs ###"
303         OSC="osc"
304         run_MDtest $NORM
305 }
306 run_test mdtest "Performance comparision: mdtest"
307
308 test_IOR() {
309         OSC="mdc"
310         run_IOR $DOM
311         echo "### Data-on-MDT files, no IO lock on open ###"
312         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=0
313         OSC="mdc"
314         run_IOR $DOM
315         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=1
316         OSC="osc"
317         run_IOR $NORM
318 }
319 run_test IOR "Performance comparision: IOR"
320
321 test_dbench() {
322         OSC="mdc"
323         run_dbench $DOM
324         echo "### Data-on-MDT files, no IO lock on open ###"
325         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=0
326         OSC="mdc"
327         run_dbench $DOM
328         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=1
329         OSC="osc"
330         run_dbench $NORM
331 }
332 run_test dbench "Performance comparision: dbench"
333
334 test_smf() {
335         OSC="mdc"
336         run_smallfile $DOM
337         echo "### Data-on-MDT files, no IO lock on open ###"
338         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=0
339         OSC="mdc"
340         run_smallfile $DOM
341         do_facet $SINGLEMDS lctl set_param -n mdt.*.dom_lock=1
342         OSC="osc"
343         run_smallfile $NORM
344
345 }
346 run_test smf "Performance comparision: smallfile"
347
348 complete $SECONDS
349 check_and_cleanup_lustre
350 exit_status