#!/bin/bash export nwif=eth0 bandwidth="" remotedir="$PWD" provision=false asynclist="sync async" modelist="listener polling waitset" sizelist="0 20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 200000 500000 1000000" timeout=30 loopback=true resultdir="throughput-result" force=false netstats=false usage () { cat >&2 <$cfg < \${nwif} $loopback \${async:-0} 2s fine \${trace} \${logdir}/cdds.log EOF if [ ! -x bin/ddsperf ] ; then echo "bin/ddsperf not found on the local machine" >&2 exit 1 fi if [ ! -d $resultdir ] ; then mkdir $resultdir elif $force ; then rm -rf $resultdir mkdir $resultdir elif [ `ls $resultdir | wc -l` -gt 0 ] ; then echo "output directory $resultdir is non-empty" >&2 exit 1 fi [ -d $resultdir ] || { echo "output directory $resultdir doesn't exist" >&2 ; exit 1 ; } if $provision ; then echo "provisioning ..." for r in "$@" ; do ssh $r mkdir -p $remotedir $remotedir/bin $remotedir/lib scp lib/libddsc.so.0 $r:$remotedir/lib scp bin/ddsperf $r:$remotedir/bin done fi topic=KS [ -z "$sizelist" ] && topic=OU export CYCLONEDDS_URI=file://$PWD/$cfg for r in "$@" ; do scp $cfg $r:$remotedir || { echo "failed to copy $cfg to $remote:$PWD" >&2 ; exit 1 ; } done for async_mode in $asynclist ; do case "$async_mode" in sync) async=0 ;; async) async=1 ;; *) echo "$async_mode: invalid setting for ASYNC" >&2 ; continue ;; esac export async for sub_mode in $modelist ; do echo "======== ASYNC $async MODE $sub_mode =========" subpids="" cat > run-subscriber.tmp < sub.log & pid=\$! echo \$pid > throughput-test-sub-\$pid.pid wait \$pid #kill -INT \$tcpdumppid EOF for r in "$@" ; do scp run-subscriber.tmp $r:$remotedir ssh $r ". $remotedir/run-subscriber.tmp" & subpids="$subpids $!" done outdir=$resultdir/$async_mode-$sub_mode mkdir $outdir rm -f $outdir/pub.log export logdir=$outdir if $netstats ; then ping `echo $1 | sed -e 's/.*@//'` > $outdir/ping.log & netstats_pids=$! if [ "`uname -s`" = "Darwin" ] ; then rm -f $outdir/netstat.log bash -c "while true ; do /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I >> $outdir/netstat.log ; sleep 1; done" & netstats_pids="$netstats_pids $!" fi fi for size in ${sizelist:-0} ; do echo "size $size" #export trace=trace,-content bin/ddsperf -Q minmatch:$# -Q initwait:3 \ -c -d $nwif$bandwidth \ -D $timeout -T $topic \ pub size $size | \ tee -a $outdir/pub.log done if $netstats ; then kill $netstats_pids fi for r in "$@" ; do ssh $r "kill -9 \`cat $remotedir/throughput-test-sub-*.pid\` ; rm $remotedir/throughput-test-sub-*.pid" done wait for r in "$@" ; do scp $r:$remotedir/sub.log $outdir/sub-$r.log done # write a summary, one line per second # col 0: raw network receive bandwidth (Mb/s) # col 1: appl receive bandwidth, 1s trailing average (Mb/s) # col 2: appl receive bandwidth, 10s trailing average (Mb/s) # (this assumes the network interface name is eth, en, or lo, optionally followed by a 0) perl -ne 'if(/size \d+ total.* (\d+\.\d+) Mb\/s.* (\d+\.\d+) Mb\/s/){$r=$1;$r10=$2;}if(/(?:eth|en|lo)0?: xmit.*? recv (\d+\.\d+)/){printf "%f %f %f\n", $1, $r, $r10;}' $outdir/sub-$1.log > $resultdir/summary-$async_mode-$sub_mode.txt perl -ne 'print "$1 $2\n" if /^(\d+)\s+(\d+)(\s+\d+)$/' $outdir/pub.log > $resultdir/rexmit-bytes.txt perl -ne 'print "$1 $2\n" if /^DISCARDED\s+(\d+)\s+(\d+)$/' $outdir/sub-$1.log > $resultdir/discarded.txt if $netstats ; then perl -ne 'print "$1\n" if /time=([0-9.]+)/' $outdir/ping.log > $resultdir/lat.log if [ "`uname -s`" = "Darwin" ] ; then perl -ne 'if(/CtlRSSI:\s*(-?\d+)/){$rssi=$1;}if(/CtlNoise:\s*(-?\d+)/){$noise=$1;}if(/maxRate:\s*(\d+)/){$max=$1;}if(/lastTxRate:\s*(\d+)/){$lasttx=$1;print "$max $lasttx $rssi $noise\n"}' $outdir/netstat.log > $resultdir/net.log fi fi done done