Whamcloud - gitweb
fix some probs with 1.6
[fs/lustre-release.git] / lustre-iokit / ost-survey / ost-survey.sh
1 #!/bin/bash
2
3 # This script is to be run on a client machine and will test all the 
4 # OSTs to determine which is the fastest and slowest
5 # The current test method 
6 # Create a directory for each OST
7 # Use 'lfs setstripe' to set the Lustre striping such that IO goes to 
8 # only one OST
9 # Use 'dd' to write a file of a specified size
10 # Use 'dd' to read a file of a specified size
11 # Compute the average 
12 # Find the slowest OST
13
14
15 declare -a rTime=()          # Time to read some data
16 declare -a wTime=()          # Time to write some data
17 declare -a rMBs=()           # Read speed
18 declare -a wMBs=()           # Write speed
19
20 # GLOBALS
21 OSTS=0                       # Number of OSTS we will loop over
22 OFILE=testdummy              #  File name to use
23 BSIZE=1024                   # size of blocks to be written 
24 MNT=''                       # Location of Lustre file system
25 DIR="tmpdir"                 # Name used to create a series of tmp directories
26 VERBOSE=1                    # Set this to get verbose output ( TODO - use getopts? )
27
28 # Usage
29 if [ $# -ne 2 ]; then
30    echo "Usage: $0 <size of test file in KB> <Lustre directory>"
31    exit 1
32 fi
33
34
35 test_preq () {
36     # check for a mounted Lustre filesystem
37     MNT=`grep ":/lustre" /proc/mounts | awk '{print $2}'`
38     if [ -z "$MNT" ]; then
39         echo "Mounted Lustre filesystem not found"
40         exit 1
41     fi
42     
43     # Check for Lustre utilites in PATH
44     # Check for dd
45 }
46
47 ost_count () {
48   OSTS=$(cat /proc/fs/lustre/lov/lustre-clilov-*/numobd | head -1)
49 }
50
51 make_dummy () {
52 # Create a file full of zeros
53     echo "make dummy"
54     local DIR=$1
55     local SIZE=$2
56     mkdir -p $MNT/$DIR
57     dd if=/dev/zero of=$MNT/$DIR/$OFILE count=$SIZE bs=$BSIZE 2> /dev/null
58     
59 }
60
61 output_all_data () {
62     echo "$OSTS OST devices found"
63     local CNT=0
64     while [ $CNT -lt $OSTS ]; do
65         echo "Ost index $CNT Read speed ${rMBs[$CNT]} Write speed ${wMBs[$CNT]}"
66         echo "Ost index $CNT Read time ${rTime[$CNT]} Write time ${wTime[$CNT]}"
67         CNT=$(( $CNT + 1 ))
68     done
69 }
70 run_test () {
71     local DIR=$1
72     local SIZE=$2
73     local INX=$3
74     local ACTION=$4
75     
76     if [ ! -f $MNT/$DIR/$OFILE ] && [ $ACTION == 'read' ]; then
77         make_dummy $DIR $SIZE
78     fi
79
80     t0=`date +%s.%N`
81     if [ $ACTION == 'read' ]; then 
82         OUTS=`dd if=$MNT/$DIR/$OFILE of=/dev/null count=$SIZE bs=$BSIZE 2> /dev/null`
83     elif [ $ACTION == 'write' ]; then 
84         OUTS=`dd of=$MNT/$DIR/$OFILE if=/dev/zero count=$SIZE bs=$BSIZE 2> /dev/null`
85     else
86         echo "Action not read||write"
87         exit 1
88     fi
89     t1=`date +%s.%N`
90
91     tdelta=`awk "BEGIN {printf \"%7.2f\", $t1 - $t0; exit}"`
92     sdelta=$(( $SIZE * $BSIZE ))
93     delta=`awk "BEGIN {printf \"%7.2f\", ($SIZE * $BSIZE / ( $t1 - $t0 )) / ( 1024 * 1024 ) ; exit}"`
94     
95     if [ $ACTION == 'read' ]; then 
96         rTime[$INX]=$tdelta
97         rMBs[$INX]=$delta
98     else 
99         wTime[$INX]=$tdelta
100         wMBs[$INX]=$delta
101     fi
102 }
103
104 display_average () {
105     local CNT=0
106     local OP=$1
107     while [ $CNT -lt $OSTS ]; do
108         if [ $OP == "read" ]; then
109             echo "${rMBs[$CNT]} $OP"
110         elif [ $OP == "write" ]; then
111             echo "${wMBs[$CNT]} $OP"
112         else
113             echo "Bad param"
114             exit 1
115         fi
116         CNT=$(( $CNT + 1 ))
117     done |  awk '{ c++; t+= $1; op = $2 }; END { printf "Average %s Speed: %7.2f\n", op, t/c }'
118
119 }
120
121 find_min () {
122     local CNT=0
123     local OP=$1
124     while [ $CNT -lt $OSTS ]; do
125         if [ $OP == "read" ]; then
126             echo "${rMBs[$CNT]} $CNT $OP"
127         elif [ $OP == "write" ]; then 
128             echo "${wMBs[$CNT]} $CNT $OP"
129         else
130             echo "Bad param"
131             exit 1
132         fi
133             CNT=$(( $CNT + 1 ))
134     done | awk '{
135         if (NR == 1) { min = $1; indx = $2; op = $3 } 
136         else if (min > $1){  min = $1; indx = $ 2; op = $3}
137     } 
138     END {printf "%s - Worst OST indx %d %7.2f MB/s\n", op, indx, min}'
139 }
140
141 find_max () {
142     local CNT=0
143     local OP=$1
144     while [ $CNT -lt $OSTS ]; do
145         if [ $OP == "read" ]; then
146             echo "${rMBs[$CNT]} $CNT $OP"
147         elif [ $OP == "write" ]; then 
148             echo "${wMBs[$CNT]} $CNT $OP"
149         else
150             echo "Bad param"
151             exit 1
152         fi
153             CNT=$(( $CNT + 1 ))
154     done | awk '{
155         if (NR == 1) { max = $1; indx = $2; op = $3 } 
156         else if (max < $1){  max = $1; indx = $ 2; op = $3 }
157     } 
158     END {printf "%s - Best OST indx %d %7.2f MB/s\n", op, indx, max}'
159 }
160 # Temp cleanup
161
162 CNT=0
163 MYSIZE=1024
164
165 test_preq
166 ost_count
167
168 while [ $CNT -lt $OSTS ]; do
169     rm -rf $MNT/${DIR}${CNT}
170     mkdir -p $MNT/${DIR}${CNT}
171     lfs setstripe $MNT/${DIR}${CNT} 0 $CNT 1
172     run_test ${DIR}${CNT} $MYSIZE $CNT write
173     run_test ${DIR}${CNT} $MYSIZE $CNT read
174     CNT=$(( $CNT + 1 ))
175 done
176
177 MAX_MB=0
178 MIN_T=999999999
179
180 display_average read
181 display_average write
182 find_min read
183 find_min write
184 find_max read
185 find_max write
186
187 CNT=0
188
189
190 if [ $VERBOSE ]; then
191     output_all_data
192 fi
193