1#!/bin/sh
2#
3# This script runs a series of netperf tests intended to gather the 
4# raw material necessary to arrive at estimates for the cost of
5# sending and receiving a TCP segment, the cost of each additional byte
6# and the cost of each incremental segment.
7# 
8# there are a number of data points gathered by this script - it might
9# run for a considerable length of time.
10#
11# rick jones 4/99
12#
13# teach it about processor affinity and the TCP_MSS test
14# rick jones 2007-11-08
15#
16
17if [ $# -gt 2 ]; then
18  echo "try again, correctly -> packet_byte_script hostname [CPU]"
19  exit 1
20fi
21
22if [ $# -eq 0 ]; then
23  echo "try again, correctly -> packet_byte_script hostname [CPU]"
24  exit 1
25fi
26
27# where is netperf
28NETPERF_DIR=${NETPERF_DIR:=/opt/netperf2/bin}
29
30
31# at what port will netserver be waiting? If you decide to run
32# netserver at a differnet port than the default of 12865, then set
33# the value of NETPERF_PORT apropriately
34# NETPERF_PORT="-p some_other_portnum"
35NETPERF_PORT=${NETPERF_PORT:=""}
36
37
38# The test length in seconds
39NETPERF_TIME=${NETPERF_TIME:=30}
40
41# How accurate we want the estimate of performance: 
42#      maximum and minimum test iterations (-i)
43#      confidence level (99 or 95) and interval (percent)
44NETPERF_STATS=${NETPERF_STATS:="-i 30,3 -I 99,5"}
45
46# The socket sizes that we will be testing - using -1 will let it 
47# be the system default.
48NETPERF_SKTS=${NETPERF_SKTS:="-1"}
49
50# The CPU affinity to be applied
51NETPERF_AFFINITY=${NETPERF_AFFINITY:=""}
52
53# NETPERF_CMD is an amalgam of previous variables
54NETPERF_CMD="${NETPERF_DIR}/netperf ${NETPERF_AFFINITY}"
55
56# if there are two parms, parm one it the hostname and parm two will
57# be a CPU indicator. actually, anything as a second parm will cause
58# the CPU to be measured, but we will "advertise" it should be "CPU"
59
60if [ $# -eq 2 ]; then
61  REM_HOST=$1
62  LOC_CPU="-c"
63  REM_CPU="-C"
64fi
65
66if [ $# -eq 1 ]; then
67  REM_HOST=$1
68fi
69
70MSS=`$NETPERF_CMD -H $REM_HOST -t TCP_MSS -P 0 -v 0`
71
72# The request,response sizes that we will be using. The netperf
73# command parser will treat "1" the same as "1,1" - I use 1,1 to
74# remember that it is "request,response"
75
76# start at one and multiply by two on our way to the MSS
77bar=1
78while [ $bar -lt $MSS ]
79do
80 NETPERF_REQS="${NETPERF_REQS} $bar"
81 bar=`expr $bar \* 2`
82done
83
84# and now multiples of the mss and that plus one
85for i in 1 2 3
86do
87 bar=`expr $MSS \* $i`
88 NETPERF_REQS="${NETPERF_REQS} $bar"
89 NETPERF_REQS="${NETPERF_REQS} `expr $bar + 1`"
90done
91
92bar=1
93while [ $bar -lt $MSS ]
94do
95  NETPERF_RESP="${NETPERF_RESP} $bar"
96  bar=`expr $bar \* 2`
97done
98
99for i in 1 2 3
100do
101 bar=`expr $MSS \* $i`
102 NETPERF_RESP="${NETPERF_RESP} $bar"
103 NETPERF_RESP="${NETPERF_RESP} `expr $bar + 1`"
104done
105
106
107
108# If we are measuring CPU utilization, then we can save beaucoup
109# time by saving the results of the CPU calibration and passing
110# them in during the real tests. So, we execute the new CPU "tests"
111# of netperf and put the values into shell vars.
112case $LOC_CPU in
113\-c) LOC_RATE=`$NETPERF_CMD $PORT -t LOC_CPU`;;
114*) LOC_RATE=""
115esac
116
117case $REM_CPU in
118\-C) REM_RATE=`$NETPERF_CMD $PORT -t REM_CPU -H $REM_HOST`;;
119*) REM_RATE=""
120esac
121
122# This disables header display
123NO_HDR="-P 0"
124NO_HDR=""
125
126for SOCKET_SIZE in $NETPERF_SKTS
127 do
128  echo
129  echo ------------------------------------------------------
130  echo Testing with the following command line:
131  # we echo the command line for cut and paste to th database
132  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
133       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
134       -s $SOCKET_SIZE -S $SOCKET_SIZE
135  echo
136  echo and these settings for send sizes $NETPERF_REQS
137  echo
138
139  for REQ in $NETPERF_REQS
140  do
141   # since we have the confidence interval stuff, we do not
142   # need to repeat a test multiple times from the shell
143   $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
144   -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
145   -r ${REQ},1 -s $SOCKET_SIZE -S $SOCKET_SIZE
146   NO_HDR="-P 0"
147  done
148  echo
149  echo ------------------------------------------------------
150  NO_HDR=""
151  echo Testing with the following command line:
152  # we echo the command line for cut and paste to th database
153  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
154       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
155       -s $SOCKET_SIZE -S $SOCKET_SIZE
156  echo and these settings for response sizes $NETPERF_RESP
157  echo
158  for RESP in $NETPERF_RESP
159   do
160   # since we have the confidence interval stuff, we do not
161   # need to repeat a test multiple times from the shell
162   $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
163   -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
164   -r 1,${RESP} -s $SOCKET_SIZE -S $SOCKET_SIZE
165   NO_HDR="-P 0"
166 done
167  echo
168  echo ------------------------------------------------------
169  NO_HDR=""
170  echo Testing with the following command line:
171  # we echo the command line for cut and paste to th database
172  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_STREAM\
173       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
174       -s $SOCKET_SIZE -S $SOCKET_SIZE
175  echo and these settings for response sizes $NETPERF_RESP
176  echo
177  for REQ in $NETPERF_REQS
178   do
179   # since we have the confidence interval stuff, we do not
180   # need to repeat a test multiple times from the shell
181   $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
182   -t TCP_STREAM $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
183   -m ${REQ} -s $SOCKET_SIZE -S $SOCKET_SIZE -D
184   NO_HDR="-P 0"
185 done
186done
187
188# The test length in seconds for the CRR test, which needs to be
189#    longer for a connect/request/response test
190
191NETPERF_CRR_TIME=${NETPERF_CRR_TIME:=120}
192
193# now we do the TCP_CRR test
194echo
195echo ------------------------------------------------------
196echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
197       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
198       -s $SOCKET_SIZE -S $SOCKET_SIZE
199echo
200$NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
201       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
202       -s $SOCKET_SIZE -S $SOCKET_SIZE
203