Whamcloud - gitweb
* Added ior-survey (still being developed)
[fs/lustre-release.git] / lustre-iokit / ior-survey / ior-survey
1 #!/bin/bash
2
3 cluster=adev
4 servers=(4 7)
5 server_disks=([4]=sdd [7]=sdd)
6 clients=(8-15 0-1)
7
8 min_clients=1
9 max_clients=10
10
11 per_client_size=4G
12 transfer_size=1M
13 tasks_per_client=1
14 file_per_task=1
15
16 IOR="/home/ericb/ior/src/C/IOR"
17 script="/home/ericb/eeb_ior_script"
18
19 testfile=/mnt/lustre/ior_survey_testfile
20
21
22 ################################################################################
23 cat > $script <<EOF
24 IOR START
25 #                                      -f <this file>
26 #   blockSize=<set from cmdline>       -b 8G
27 #   transferSize=<set from cmdline>    -t 1M
28 #   filePerProc=<set from cmdline>     -F
29 #   testFile=<set from cmdline>        -o /mnt/lustre/ior_testfile
30 #   uniqueDir=<set from cmdline>       -u
31 #   verbose=<set from cmdline>         -v
32 #   reorderTasks=<set from cmdline>    -C
33
34 # unused options  
35 #   collective=0 (MPI only)
36 #   individualDataSets=0 [not working]
37 #   noFill=0 (HDF5 only)    
38 #   preallocate=0 (MPI only)
39 #   useSharedFilePointer=0 [not working]
40 #   useFileView=<MPI only>
41 #   useStridedDataType=0(MPI only)
42 #   showHints=0
43 #   showHelp=0
44
45 # setup
46     api=POSIX
47     fsync=1
48     repetitions=1
49     useO_DIRECT=0
50     interTestDelay=10
51     intraTestBarriers=1
52     storeFileOffset=0
53     quitOnError=1
54     segmentCount=1
55     singleXferAttempt=0
56
57 # write
58     readFile=0
59     writeFile=1
60     useExistingTestFile=0
61     keepFile=1
62     RUN
63
64 # rewrite
65     useExistingTestFile=1
66     RUN
67
68 # read
69     readFile=1
70     writeFile=0
71     useExistingTestFile=1
72     RUN
73
74 # reread (bug in ior means it needs each run needs at least 1 directive)
75     readFile=1
76     RUN
77
78 # write again
79     readFile=0
80     writeFile=1
81     useExistingTestFile=1
82     keepFile=0
83     RUN
84 IOR STOP
85
86 EOF
87
88 ################################################################################
89
90 count_range() {
91     echo $1 | awk '{ nvals=split($1, vals, "-");\
92                      if (nvals == 1) print 1;\
93                      else if (nvals == 2) printf "%d\n", vals[2] - vals[1] + 1;}'
94 }
95
96 base_range() {
97     echo $1 | awk '{ split($1, vals, "-"); print vals[1]; }'
98 }
99
100 idx2nodenum() {
101     n=$1; shift
102     while ((1)); do
103         range=$1; shift
104         if [ -z "$range" ]; then
105             return
106         fi
107         chunk=`count_range $range`
108         if ((chunk > n)); then
109             base=`base_range $range`
110             echo $((base + n))
111             return
112         fi
113         n=$((n-chunk))
114     done
115 }
116
117 n2noderange() {
118     n=$1; shift
119     sep=""
120     nodes="["
121     while ((n > 0)); do
122         range=$1; shift
123         if [ -z "$range" ]; then
124             return
125         fi
126         base=`base_range $range`
127         chunk=`count_range $range`
128         if ((chunk > n)); then chunk=n; fi
129         nodes="${nodes}${sep}${base}"; sep=","
130         if ((chunk > 1)); then nodes="${nodes}-$((base+chunk-1))"; fi
131         n=$((n-chunk))
132     done
133     echo "${nodes}]"
134 }
135
136 countnodes() {
137     radix=16384
138     n=0
139     while ((radix > 0)); do
140         nodes=`n2noderange $((n+radix)) $@`
141         if [ -n "$nodes" ]; then
142             n=$((n+radix))
143         fi
144         radix=$((radix/2))
145     done
146     echo $n
147 }
148
149 parse_number() {
150     str=$1
151     case $str in
152         *G|*g) n=`echo $str | sed 's/[gG]//'`; echo $((n*1024*1024*1024));;
153         *M|*m) n=`echo $str | sed 's/[Mm]//'`; echo $((n*1024*1024));;
154         *K|*k) n=`echo $str | sed 's/[Kk]//'`; echo $((n*1024));;
155         *)     echo $1;;
156     esac
157 }
158
159 pp_number() {
160     n=$1
161     G=$((1024*1024*1024))
162     M=$((1024*1024))
163     K=$((1024))
164     if ((n%G == 0 && n >= G)); then
165         echo "$((n/G))G"
166     elif ((n%M == 0 && n >= M)); then
167         echo "$((n/M))M"
168     elif ((n%K == 0 && n >= K)); then
169         echo "$((n/K))K"
170     else
171         echo $n
172     fi
173 }
174
175 nservers=`countnodes ${servers[@]}`
176 nclients=`countnodes ${clients[@]}`
177
178 if ((max_clients > nclients)); then max_clients=$nclients; fi
179 if ((file_per_task)); then minusFopt=-F; else minusFopt=""; fi
180
181 for ((i=min_clients - 1;i<max_clients;i++)); do
182     tc=`printf "%3d tasks, %4d clients" $tasks_per_client $((i+1))`
183     echo "=================================== $tc ================================================"
184
185     clients="${cluster}`n2noderange $((i+1)) ${clients[@]}`"
186     per_task_size=$((`parse_number $per_client_size`/tasks_per_client))
187     per_task_size=`pp_number $per_task_size`
188
189     pdsh -b -Rmqsh -w "$clients" -n $tasks_per_client \
190          $IOR -b${per_task_size} -t${transfer_size} $minusFopt -o $testfile -f $script
191
192 done
193