386 lines
9.1 KiB
Text
Executable file
386 lines
9.1 KiB
Text
Executable file
# 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
|
|
|