# this is retained mostly for historical purposes and may not be # up to date for contemporary netperf versions # # a script that can be used to measure aggregate netperf performance, # original author is Mike Traynor. Modifications to create the # "netperf TCP_ARR test" by rick jones # init_parms() { TEST_TIME=60 NTEST=3 TOLERANCE=15 MAX_RETRIES=3 NETPERF="/usr/local/netperf/netperf" NETPERF="./netperf" NPROC_LIST="" RR_SIZES="" REM_HOST_LIST="" DEVFILELIST="" LLA=0 TCP=1 UDP=0 GPROF=0 } set_default_parms() { if [ "X$NPROC_LIST" = "X" ] then NPROC_LIST="1" fi if [ "X$REM_HOST_LIST" = "X" ] then REM_HOST_LIST="127.0.0.1" fi if [ "X$RR_SIZES" = "X" ] then RR_SIZES="1,1" fi NHOSTS=`echo $REM_HOST_LIST | awk '{printf "%d",NF}'` GPROF_RUN_TIME=`expr $TEST_TIME - 20` } usage() { more << @EOF $* USAGE: scale_script {test_options} {hostlist} Measure maximum system network throughput. The following are optional parameters: -t nsec : Causes each test to be run for nsec seconds. -gprof system : Take a gprof sample during the test. system is the name of the kernel the system was booted with. -n "nproclist" : One series of tests is run for each space-separated value in nproclist. -r "sizelist" : One series of tests is run for each space-separated request,reply pair in sizelist. hostlist : A space separated list of hosts to test against. +|-tcp : Run/Don't run TCP tests. +|-udp : Run/Don't run UDP tests. +|-lla : Run/Don't run LLA tests; this option also requires the user to specify a list of network device files using the -d option described below. The following option must be provided when using the -lla option described above: -d "devfilelst" : Where devfilelst is a space-separated list of network device file pairs. Each pair in the list contains two device file names, separated by a comma (eg. /dev/lan0,/dev/lan1), where the device file on the left side of the comma is for the local system and the device file on the right side is for the remote system. A device file pair must be specified for each remote host which is specified. Examples: scale_script -n "8 16" -udp LGs37U1 LGs37U2 -r "1,1 100,100" scale_script -t 1000 -n "16" -tcp -gprof /stand/vmunix LGs37U1 LGs37U2 scale_script -n 4 -lla -d /dev/lan0,/dev/lan0 /dev/lan1,/dev/lan0 \\ LGs37U1 LGs37U2 @EOF } check_usage() { if [ `expr $TCP + $UDP + $LLA` -eq 0 ] then usage $0: ERROR: Must specify a test exit fi if [ $LLA -eq 1 ] then NDEV=`echo $DEVFILELIST | awk '{printf "%d",NF}'` if [ $NDEV -ne $NHOSTS ] then usage $0: ERROR: Number of device files does not match number of hosts exit fi fi for HOST in $REM_HOST_LIST do if [ `/etc/ping $HOST 100 1 | awk '/transmitted/{print $4}'`0 -ne 10 ] then usage $0: ERROR: Cannot ping host: $HOST exit fi done if [ $GPROF -eq 1 ] then if [ ! -r $GPROF_KERNEL ] then usage $0: ERROR: Cannot find system file: $GPROF_KERNEL exit fi if [ $GPROF_RUN_TIME -le 800 ] then echo "\nWARNING: GPROF RUN TIME LESS THAN 800 SECONDS\n" fi fi } display_headstone() { cat << @EOF $TESTNAME Aggregate REQUEST/RESPONSE TEST to $REM_HOST_LIST Local /Remote Socket Size Request Resp. Elapsed Trans. Num. Send Recv Size Size Time Rate Concurrent bytes Bytes bytes bytes secs. per sec Netperfs @EOF } display_test_banner() { cat << @EOF @EOF } build_sap_list() { LSAP=4 SAPLIST="" PROC=0 while [ $PROC -lt $NPROCS ] do PROC=`expr $PROC + 1` LSAP=`expr $LSAP + 4` RSAP=`expr $LSAP + 2` SAPLIST="$SAPLIST $LSAP,$RSAP" done } start_gprof() { if [ $GPROF -eq 1 ] then ( kgmon -h; kgmon -r; sleep 10; kgmon -b; sleep $GPROF_RUN_TIME; kgmon -h; kgmon -p $GPROF_KERNEL; mv gmon.out gmon.out.$TEST.$NPROCS )& fi } start_1_proc_per_host() { HOSTNUM=0 for HOST in $REM_HOST_LIST do if [ "$TEST" = "HIPPI_RR" ] then PROCNUM=`expr $PROCNUM + 1` SAP=`echo $SAPLIST | awk "{print \\$$PROCNUM}"` SAP="-s $SAP" HOSTNUM=`expr $HOSTNUM + 1` DEVFILE=`echo $DEVFILELIST | awk "{print \\$$HOSTNUM}"` DEVFILE="-D $DEVFILE" fi $NETPERF -t $TEST -l $TEST_TIME -H $HOST -P0 -v0 -- \ $COW $DEVFILE $SAP $RR_SIZE $SEND_SIZE $SOCKET_SIZE & done } start_n_procs_per_host() { PROC=0 while [ $PROC -lt $1 ] do PROCNUM=`expr $PROC \* ${NHOSTS}` start_1_proc_per_host & PROC=`expr $PROC + 1` done wait } run_1_test() { start_n_procs_per_host $PROCS_PER_HOST |\ awk 'BEGIN {max=0;min=99999;sum=0;n=0} \ {sum += $1;n++;ave=sum/n} \ $1<min {min=$1} \ $1>max {max=$1} \ {errl=(ave-min)/ave;errm=(max-ave)/ave;err=errl} \ errm>errl {err=errm} \ END {printf "Aggregate throughput: %2.2f TPS +/- %2.2f %%\n",sum,err*100}' } run_test_n_times() { RETRY=0 TEST_COUNT=0 while [ $TEST_COUNT -lt $1 ] do TEST_COUNT=`expr $TEST_COUNT + 1` start_gprof run_1_test > .run_test_n_file cat .run_test_n_file ERROR_LVL=`awk '{print int($6+0.99)}' .run_test_n_file` if [ $ERROR_LVL -gt $TOLERANCE ] then RETRY=`expr $RETRY + 1` if [ $RETRY -le $MAX_RETRIES ] then TEST_COUNT=`expr $TEST_COUNT - 1` TEST_TIME=`expr $TEST_TIME \* 2` else echo "!!!This is an INVALID RUN of the arr_script!!!" >&2 echo "!!!UNABLE to hit TOLERANCE of " $TOLERANCE "!!!" >&2 echo "Please select a longer initial time and try again." >&2 exit fi fi done } do_req_rr_sizes() { for S2 in $RR_SIZES do RR_SIZE="-r $S2" display_test_banner $NPROCS $TEST $S2 run_test_n_times $NTEST > .do_series_file TPS=`awk "int(\$6+0.99)<=$TOLERANCE {print}" .do_series_file |\ awk 'BEGIN {sum=0;n=1} \ sum>0 {n++} \ {sum+=$3} \ END {printf "%2.2f\n",(sum)/(n)}'` SOCK_SEND=`echo $SOCKET_SIZE | awk '{print $2}'` SOCK_RECV=`echo $SOCKET_SIZE | awk '{print $4}'` REQ_SIZE=`echo $S2 | awk -F"," '{print $1}'` RSP_SIZE=`echo $S2 | awk -F"," '{print $2}'` echo $SOCK_SEND $SOCK_RECV $REQ_SIZE $RSP_SIZE $TEST_TIME $TPS $PROCS |\ awk '{printf "%5d %5d %5d %5d %5d %8.2f %5d",$1,$2,$3,$4,$5,$6,$7}' done } tcp_test() { #Run the TCP RR tests TEST="TCP_RR" SEND_SIZE="" SOCKET_SIZE="-s 8192 -S 8192" COW="-V" do_req_rr_sizes echo } udp_test() { #Run the UDP RR tests TEST="UDP_RR" SEND_SIZE="" SOCKET_SIZE="-s 9216 -S 9216" COW="-V" do_req_rr_sizes echo } lla_test() { #Run the UDP RR tests TEST="HIPPI_RR" SEND_SIZE="" SOCKET_SIZE="" COW="" build_sap_list do_req_rr_sizes echo } do_req_procs() { if [ $TCP -eq 1 ] then TESTNAME="TCP" display_headstone for PROCS in $NPROC_LIST do #Determine number of procs per host PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` tcp_test done fi if [ $UDP -eq 1 ] then TESTNAME="UDP" display_headstone for PROCS in $NPROC_LIST do #Determine number of procs per host PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` udp_test done fi if [ $LLA -eq 1 ] then TESTNAME="LLA" display_headstone for PROCS in $NPROC_LIST do #Determine number of procs per host PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` lla_test done fi } ###################################################################### init_parms PARMS="${0##*/} ${@}" # Parse the command line while [ $# != 0 ] do case $1 in \-gprof) GPROF=1 GPROF_KERNEL=$2 shift ;; \-t) TEST_TIME=$2 shift ;; \-n) NPROC_LIST="$NPROC_LIST $2" shift ;; \+lla) LLA=1 ;; \+tcp) TCP=1 ;; \+udp) UDP=1 ;; \-lla) LLA=0 ;; \-tcp) TCP=0 ;; \-udp) UDP=0 ;; \-d) DEVFILELIST="$DEVFILELIST $2" shift ;; \-r) RR_SIZES="$RR_SIZES $2" shift ;; \-*) usage $0: ERROR: Unexpected paramter: $1 exit ;; *) REM_HOST_LIST="$REM_HOST_LIST $1" ;; esac shift done set_default_parms check_usage do_req_procs