X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre-iokit%2Fsgpdd-survey%2Fsgpdd-survey;h=db40392f5a136bcc4768a73e74de870d468b079e;hp=16709e302bba1c0fa9b171cddca16afb57401432;hb=2606b783041ef0d126f2a7377378e434d2df5436;hpb=6246beb119322f5a31872e26ec51652b7a0702b9 diff --git a/lustre-iokit/sgpdd-survey/sgpdd-survey b/lustre-iokit/sgpdd-survey/sgpdd-survey index 16709e3..db40392 100755 --- a/lustre-iokit/sgpdd-survey/sgpdd-survey +++ b/lustre-iokit/sgpdd-survey/sgpdd-survey @@ -3,29 +3,34 @@ ###################################################################### # customize per survey -# the SCSI devices to measure -scsidevs=${scsidevs:-"/dev/sde /dev/sdh"} +# CHOOSE EITHER scsidevs or rawdevs +# the SCSI devices to measure - WARNING: will be erased. +# The raw devices to use +# rawdevs=${rawdevs:-"/dev/raw/raw1"} +# scsidevs=`ls /dev/sd[a-z] /dev/sd[a-z][a-z]` # all devices, if you use udev # result file prefix. date/time+hostname makes unique # NB ensure the path exists if it includes subdirs -rslt=${rslt:-"/tmp/sgpdd_survey_`date +%F@%R`_`uname -n`"} +rslt_loc=${rslt_loc:-"/tmp"} +rslt=${rslt:-"$rslt_loc/sgpdd_survey_`date +%F@%R`_`uname -n`"} # what to do (read or write) -actions="write read" +actions=${actions:-"write read"} # total size per device (MBytes) # NB bigger than device cache is good -size=8192 +size=${size:-8192} # record size (KBytes) -rszlo=1024 -rszhi=1024 +rszlo=${rszlo:-1024} +rszhi=${rszhi:-1024} # Concurrent regions per device crglo=${crglo:-1} crghi=${crghi:-256} # threads to share between concurrent regions per device +# multiple threads per region simulates a deeper request queue # NB survey skips over #thr < #regions and #thr/#regions > SG_MAX_QUEUE thrlo=${thrlo:-1} thrhi=${thrhi:-4096} @@ -33,24 +38,68 @@ thrhi=${thrhi:-4096} ##################################################################### # leave the rest of this alone unless you know what you're doing... -# sgp_dd's idea of disk sector size (Bytes) -bs=512 # and max # threads one instance will spawn SG_MAX_QUEUE=16 +# is the sg module loaded? +sg_is_loaded=$(grep -q "^sg " /proc/modules && echo true || echo false) + +# did we load it? +sg_was_loaded=false + # map given device names into SG device names i=0 devs=() -for d in $scsidevs; do - devs[$i]=`sg_map | awk "{if ($ 2 == \"$d\") print $ 1}"` - if [ -z "$devs[$i]" ]; then - echo "Can't find SG device for $d" - exit 1 +if [ "$scsidevs" ]; then + # we will test for a LUN, the test for a partition + # if the partition number is > 9 this will fail + + # make sure sg kernel module is loaded + if ! $sg_is_loaded; then + echo "loading the sg kernel module" + modprobe sg && sg_was_loaded=true + sg_is_loaded=true fi - i=$((i+1)) -done + + for d in $scsidevs; do + devs[$i]=`sg_map | awk "{if (\\\$2 == \"$d\") print \\\$1}"` + if [ -z "${devs[i]}" ]; then + echo "Can't find SG device for $d, testing for partition" + pt=`echo $d | sed 's/[0-9]$//'` + # Try again + devs[$i]=`sg_map | awk "{if (\\\$2 == \"$pt\") print \\\$1}"` + if [ -z "${devs[i]}" ]; then + echo -e "Can't find SG device $pt.\nDo you have the sg module configured for your kernel?" + exit 1 + fi + fi + i=$((i+1)) + done +elif [ "$rawdevs" ]; then + for r in $rawdevs; do + RES=`raw -q $r` + if [ $? -eq 0 ];then + devs[$i]=$r + i=$((i+1)) + else + echo "Raw device $r not set up" + exit 1 + fi + done +else + echo "Must specify scsidevs or rawdevs" + exit 1 +fi + ndevs=${#devs[@]} +# determine block size. This should also work for raw devices +# If it fails, set to 512 +bs=$((`sg_readcap -b ${devs[0]} | awk '{print $2}'`)) +if [ $bs == 0 ];then + echo "sg_readcap failed, setting block size to 512" + bs=512 +fi rsltf=${rslt}.summary workf=${rslt}.detail echo -n > $rsltf @@ -66,6 +115,8 @@ print_summary () { echo $minusn "$*" } +print_summary "$(date) sgpdd-survey on $rawdevs$scsidevs from $(hostname)" + for ((rsz=$rszlo;rsz<=$rszhi;rsz*=2)); do for ((crg=$crglo;crg<=$crghi;crg*=2)); do for ((thr=$thrlo;thr<=$thrhi;thr*=2)); do @@ -97,6 +148,13 @@ for ((rsz=$rszlo;rsz<=$rszhi;rsz*=2)); do t0=`date +%s.%N` for ((i=0;i /dev/null 2>&1; then + if grep 'error' $rtmp > /dev/null 2>&1; then + echo "Error found in $rtmp" + elif grep 'time to transfer data' $rtmp > /dev/null 2>&1; then ok=$((ok + 1)) fi cat ${rtmp} >> $tmpf @@ -145,3 +205,8 @@ for ((rsz=$rszlo;rsz<=$rszhi;rsz*=2)); do done done done + +if $sg_was_loaded; then + echo "unloading sg module" + rmmod sg +fi