#!/bin/sh # File: stream_test # Description: test network throughput with a varying number of streams # Author: Vernon Mauery # Copyright: IBM Corporation (C) 2007 instances="1 2 4 8" msg_size= time=60 TEST=UDP_STREAM sock_size= function usage() { echo "usage: $0 [-t|-u] [-c N] [-m N] [-s N] [-T N] [-x ...] " echo " -t, -u run TCP or UDP tests respectively (default: UDP)" echo " -c N run N concurrent instances (default \"1 2 4 8\")" echo " -m N set message size to N bytes (default 1472)" echo " -s N set socket buffer size (default 1M)" echo " -T N run test for N seconds (default 60)" echo " -x '...' pass extra ags to netperf (included after -- )" echo " -h display this message" } while [ $# -gt 0 ]; do case $1 in -t) TEST=TCP_STREAM ;; -u) TEST=UDP_STREAM ;; -c) shift instances=$1 ;; -m) shift msg_size=$1 ;; -s) shift sock_size=$1 ;; -T) shift time=$1 ;; -x) shift extra_args=$1; ;; -h) usage exit 0 ;; *) TARGET=$1 ;; esac shift done if [ -z "$TARGET" ]; then exit 1 fi if ! ping -c 1 $TARGET >&/dev/null; then echo "could not connect to $TARGET" usage exit 1 fi if [ -z "$msg_size" ]; then case $TEST in TCP_STREAM) msg_size=256k ;; UDP_STREAM) msg_size=1472 ;; esac fi if [ -z "$sock_size" ]; then case $TEST in TCP_STREAM) sock_size=2M ;; UDP_STREAM) sock_size=1M ;; esac fi function execute() { ITERS=$1 NAME=$2 ARGS=$3 for ((i=0; i<$ITERS; i++)); do command="./netperf -c -C -l $time -H $TARGET -t $TEST -- $ARGS $extra_args" echo $command echo $command > out.$$.$i $command >> out.$$.$i & done for ((i=1; i<=$ITERS; i++)); do wait %$i done date > results-$NAME.$$.$ITERS uname -a >> results-$NAME.$$.$ITERS cat out.$$.* >> results-$NAME.$$.$ITERS rm -f out.$$.* } function parse_TCP_STREAM() { ITER=$1 NAME=$2 SEND=`( cat results-$NAME.$$.$ITER | grep "^[ 0-9]" | awk '{printf "%s + ", \$5 }'; echo "0 " ) | bc` echo "** $NAME: $ITER streams: Send at $SEND Mb/s" } function parse_UDP_STREAM() { ITER=$1 NAME=$2 SEND=`( cat results-$NAME.$$.$ITER | grep "^[ 0-9]" | awk 'NR % 2 == 1 {printf "%s + ", \$6 }'; echo "0 " ) | bc` RECV=`( cat results-$NAME.$$.$ITER | grep "^[ 0-9]" | awk 'NR % 2 == 0 {printf "%s + ", \$4 }'; echo "0 " ) | bc` echo "** $NAME: $ITER streams: Send at $SEND Mb/s, Receive at $RECV Mb/s" } function cleanup() { for ((i=1; i<=$ITERS; i++)); do kill -9 %$i done rm -f out.$$.* exit } trap cleanup SIGINT SIGQUIT rm -f out.$$.* echo "results can be found in results-$$.*" for C in $instances; do execute $C default "-m $msg_size -M $msg_size" parse_$TEST $C default execute $C ${sock_size}sock "-m $msg_size -M $msg_size -s $sock_size -S $sock_size" parse_$TEST $C ${sock_size}sock done