- if [ $ok -ne $crg ]; then
- print_summary `printf "failed %d" $((crg - ok))`
- else
- # compute MB/sec from elapsed
- bw=`awk "BEGIN {printf \"%6.2f MB/s\", $actual_size / (( $t1 - $t0 ) * 1024); exit}"`
- # compute MB/sec from nregions*slowest
- check=`awk < $rfile \
- '/time to transfer data/ {mb=$8/1.048576; if (n == 0 || mb < min) min = mb; n++}\
- END {printf "%3d x %6.2f = %6.2f MB/s", n, min, min * n}'`
- print_summary "$bw $check"
- fi
- rm $rfile
+
+ # run tests
+ for action in $actions; do
+ declare -a pidarray
+ print_summary -n "$action "
+ echo "=====> $action" >> $workf
+ tmpf=${workf}_tmp
+
+ # create per-host script files
+ for host in ${unique_hosts[@]}; do
+ echo -n > ${cmdsf}_${host}
+ done
+ for ((i=0; i < $ndevs; i++)); do
+ bpt=$((rsz*1024/bs[$i]))
+ blocks=$((size*((1024*1024)/bs[$i])/crg))
+ count=$blocks
+ host=${hosts[$i]}
+ dev=${devs[$i]}
+ if [ $action = read ]; then
+ inf="if=$dev"
+ outf="of=/dev/null"
+ skip=skip
+ else
+ inf="if=/dev/zero"
+ outf="of=$dev"
+ skip=seek
+ fi
+ if [ -n "${devcpus[$i]}" -a -x "$NUMACTL" ]; then
+ numacmd="$NUMACTL --physcpubind=${devcpus[$i]} --localalloc"
+ else
+ numacmd=""
+ fi
+ for ((j=0;j<crg;j++)); do
+ echo >> ${cmdsf}_${host} \
+ "$numacmd " \
+ "sgp_dd 2> ${tmpf}_${i}_${j} $inf $outf " \
+ "${skip}=$((boundary+j*blocks)) " \
+ "thr=$((thr/crg)) count=$count bs=${bs[$i]} " \
+ "bpt=$bpt time=1&"
+ done
+ done
+ for host in ${unique_hosts[@]}; do
+ echo "wait" >> ${cmdsf}_${host}
+ done
+
+ # run of all the per-host script files
+ t0=`date +%s.%N`
+ pidcount=0
+ for host in ${unique_hosts[@]}; do
+ remote_shell $host bash < ${cmdsf}_${host} &
+ pidarray[$pidcount]=$!
+ pidcount=$((pidcount+1))
+ done
+ pidcount=0
+ for host in ${unique_hosts[@]}; do
+ wait ${pidarray[$pidcount]}
+ pidcount=$((pidcount+1))
+ done
+ t1=`date +%s.%N`
+
+ # clean up per-host script files
+ for host in ${unique_hosts[@]}; do
+ rm ${cmdsf}_${host}
+ done
+
+ # collect/check individual stats
+ echo > $tmpf
+ ok=0
+ for ((i=0;i<ndevs;i++)); do
+ for ((j=0;j<crg;j++)); do
+ rtmp=${tmpf}_${i}_${j}_local
+ remote_shell ${hosts[$i]} cat ${tmpf}_${i}_${j} > $rtmp
+ 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
+ cat ${rtmp} >> $workf
+ rm ${rtmp}
+ remote_shell ${hosts[$i]} rm ${tmpf}_${i}_${j}
+ done
+ done
+ if ((ok != ndevs*crg)); then
+ print_summary -n "$((ndevs*crg - ok)) failed "
+ else
+ # compute bandwidth in MiB/s from total data / elapsed time
+ bw=`awk "BEGIN {printf \"%7.2f \", \
+ $total_size / (( $t1 - $t0 ) * 1024); exit}"`
+ # compute global min/max stats
+ minmax=`awk < $tmpf \
+ '/time to transfer data/ {mb=$8/1.048576; \
+ if (n == 0 || mb < min) min = mb; \
+ if (n == 0 || mb > max) max = mb; \
+ n++} \
+ END {printf "[ %7.2f, %7.2f] ",min,max;}'`
+ print_summary -n "$bw $minmax "
+ fi
+ rm $tmpf
+ done
+ print_summary ""