1 # this is retained mostly for historical purposes and may not be 2 # up to date for contemporary netperf versions 3 # 4 # a script that can be used to measure aggregate netperf performance, 5 # original author is Mike Traynor. Modifications to create the 6 # "netperf TCP_ARR test" by rick jones 7 # 8 9 init_parms() { 10 TEST_TIME=60 11 NTEST=3 12 TOLERANCE=15 13 MAX_RETRIES=3 14 15 NETPERF="/usr/local/netperf/netperf" 16 NETPERF="./netperf" 17 18 NPROC_LIST="" 19 RR_SIZES="" 20 REM_HOST_LIST="" 21 DEVFILELIST="" 22 LLA=0 23 TCP=1 24 UDP=0 25 GPROF=0 26 } 27 28 set_default_parms() { 29 if [ "X$NPROC_LIST" = "X" ] 30 then 31 NPROC_LIST="1" 32 fi 33 34 if [ "X$REM_HOST_LIST" = "X" ] 35 then 36 REM_HOST_LIST="127.0.0.1" 37 fi 38 39 if [ "X$RR_SIZES" = "X" ] 40 then 41 RR_SIZES="1,1" 42 fi 43 44 NHOSTS=`echo $REM_HOST_LIST | awk '{printf "%d",NF}'` 45 GPROF_RUN_TIME=`expr $TEST_TIME - 20` 46 } 47 48 usage() { 49 more << @EOF 50 51 $* 52 53 USAGE: scale_script {test_options} {hostlist} 54 55 Measure maximum system network throughput. 56 57 The following are optional parameters: 58 59 -t nsec : Causes each test to be run for nsec seconds. 60 -gprof system : Take a gprof sample during the test. system 61 is the name of the kernel the system was booted 62 with. 63 -n "nproclist" : One series of tests is run for each space-separated 64 value in nproclist. 65 -r "sizelist" : One series of tests is run for each space-separated 66 request,reply pair in sizelist. 67 hostlist : A space separated list of hosts to test against. 68 69 +|-tcp : Run/Don't run TCP tests. 70 +|-udp : Run/Don't run UDP tests. 71 +|-lla : Run/Don't run LLA tests; this option also requires 72 the user to specify a list of network device files 73 using the -d option described below. 74 75 The following option must be provided when using the -lla option 76 described above: 77 78 -d "devfilelst" : Where devfilelst is a space-separated list 79 of network device file pairs. Each pair in 80 the list contains two device file names, 81 separated by a comma (eg. /dev/lan0,/dev/lan1), 82 where the device file on the left side of the 83 comma is for the local system and the device 84 file on the right side is for the remote system. 85 A device file pair must be specified for each 86 remote host which is specified. 87 88 Examples: 89 90 scale_script -n "8 16" -udp LGs37U1 LGs37U2 -r "1,1 100,100" 91 92 scale_script -t 1000 -n "16" -tcp -gprof /stand/vmunix LGs37U1 LGs37U2 93 94 scale_script -n 4 -lla -d /dev/lan0,/dev/lan0 /dev/lan1,/dev/lan0 \\ 95 LGs37U1 LGs37U2 96 97 @EOF 98 } 99 100 check_usage() { 101 if [ `expr $TCP + $UDP + $LLA` -eq 0 ] 102 then 103 usage $0: ERROR: Must specify a test 104 exit 105 fi 106 107 if [ $LLA -eq 1 ] 108 then 109 NDEV=`echo $DEVFILELIST | awk '{printf "%d",NF}'` 110 if [ $NDEV -ne $NHOSTS ] 111 then 112 usage $0: ERROR: Number of device files does not match number of hosts 113 exit 114 fi 115 fi 116 117 for HOST in $REM_HOST_LIST 118 do 119 if [ `/etc/ping $HOST 100 1 | awk '/transmitted/{print $4}'`0 -ne 10 ] 120 then 121 usage $0: ERROR: Cannot ping host: $HOST 122 exit 123 fi 124 done 125 126 if [ $GPROF -eq 1 ] 127 then 128 if [ ! -r $GPROF_KERNEL ] 129 then 130 usage $0: ERROR: Cannot find system file: $GPROF_KERNEL 131 exit 132 fi 133 if [ $GPROF_RUN_TIME -le 800 ] 134 then 135 echo "\nWARNING: GPROF RUN TIME LESS THAN 800 SECONDS\n" 136 fi 137 fi 138 } 139 140 display_headstone() { 141 cat << @EOF 142 143 $TESTNAME Aggregate REQUEST/RESPONSE TEST to $REM_HOST_LIST 144 Local /Remote 145 Socket Size Request Resp. Elapsed Trans. Num. 146 Send Recv Size Size Time Rate Concurrent 147 bytes Bytes bytes bytes secs. per sec Netperfs 148 149 @EOF 150 } 151 152 display_test_banner() { 153 cat << @EOF 154 @EOF 155 } 156 157 build_sap_list() { 158 LSAP=4 159 SAPLIST="" 160 PROC=0 161 while [ $PROC -lt $NPROCS ] 162 do 163 PROC=`expr $PROC + 1` 164 LSAP=`expr $LSAP + 4` 165 RSAP=`expr $LSAP + 2` 166 SAPLIST="$SAPLIST $LSAP,$RSAP" 167 done 168 } 169 170 start_gprof() { 171 if [ $GPROF -eq 1 ] 172 then 173 ( 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 )& 174 fi 175 } 176 177 start_1_proc_per_host() { 178 HOSTNUM=0 179 for HOST in $REM_HOST_LIST 180 do 181 if [ "$TEST" = "HIPPI_RR" ] 182 then 183 PROCNUM=`expr $PROCNUM + 1` 184 SAP=`echo $SAPLIST | awk "{print \\$$PROCNUM}"` 185 SAP="-s $SAP" 186 HOSTNUM=`expr $HOSTNUM + 1` 187 DEVFILE=`echo $DEVFILELIST | awk "{print \\$$HOSTNUM}"` 188 DEVFILE="-D $DEVFILE" 189 fi 190 $NETPERF -t $TEST -l $TEST_TIME -H $HOST -P0 -v0 -- \ 191 $COW $DEVFILE $SAP $RR_SIZE $SEND_SIZE $SOCKET_SIZE & 192 done 193 } 194 195 start_n_procs_per_host() { 196 PROC=0 197 while [ $PROC -lt $1 ] 198 do 199 PROCNUM=`expr $PROC \* ${NHOSTS}` 200 start_1_proc_per_host & 201 PROC=`expr $PROC + 1` 202 done 203 wait 204 } 205 206 run_1_test() { 207 start_n_procs_per_host $PROCS_PER_HOST |\ 208 awk 'BEGIN {max=0;min=99999;sum=0;n=0} \ 209 {sum += $1;n++;ave=sum/n} \ 210 $1<min {min=$1} \ 211 $1>max {max=$1} \ 212 {errl=(ave-min)/ave;errm=(max-ave)/ave;err=errl} \ 213 errm>errl {err=errm} \ 214 END {printf "Aggregate throughput: %2.2f TPS +/- %2.2f %%\n",sum,err*100}' 215 } 216 217 run_test_n_times() { 218 RETRY=0 219 TEST_COUNT=0 220 while [ $TEST_COUNT -lt $1 ] 221 do 222 TEST_COUNT=`expr $TEST_COUNT + 1` 223 start_gprof 224 run_1_test > .run_test_n_file 225 cat .run_test_n_file 226 ERROR_LVL=`awk '{print int($6+0.99)}' .run_test_n_file` 227 if [ $ERROR_LVL -gt $TOLERANCE ] 228 then 229 RETRY=`expr $RETRY + 1` 230 if [ $RETRY -le $MAX_RETRIES ] 231 then 232 TEST_COUNT=`expr $TEST_COUNT - 1` 233 TEST_TIME=`expr $TEST_TIME \* 2` 234 else 235 echo "!!!This is an INVALID RUN of the arr_script!!!" >&2 236 echo "!!!UNABLE to hit TOLERANCE of " $TOLERANCE "!!!" >&2 237 echo "Please select a longer initial time and try again." >&2 238 exit 239 fi 240 fi 241 done 242 } 243 244 do_req_rr_sizes() { 245 for S2 in $RR_SIZES 246 do 247 RR_SIZE="-r $S2" 248 display_test_banner $NPROCS $TEST $S2 249 run_test_n_times $NTEST > .do_series_file 250 TPS=`awk "int(\$6+0.99)<=$TOLERANCE {print}" .do_series_file |\ 251 awk 'BEGIN {sum=0;n=1} \ 252 sum>0 {n++} \ 253 {sum+=$3} \ 254 END {printf "%2.2f\n",(sum)/(n)}'` 255 SOCK_SEND=`echo $SOCKET_SIZE | awk '{print $2}'` 256 SOCK_RECV=`echo $SOCKET_SIZE | awk '{print $4}'` 257 REQ_SIZE=`echo $S2 | awk -F"," '{print $1}'` 258 RSP_SIZE=`echo $S2 | awk -F"," '{print $2}'` 259 echo $SOCK_SEND $SOCK_RECV $REQ_SIZE $RSP_SIZE $TEST_TIME $TPS $PROCS |\ 260 awk '{printf "%5d %5d %5d %5d %5d %8.2f %5d",$1,$2,$3,$4,$5,$6,$7}' 261 done 262 } 263 264 tcp_test() { 265 #Run the TCP RR tests 266 TEST="TCP_RR" 267 SEND_SIZE="" 268 SOCKET_SIZE="-s 8192 -S 8192" 269 COW="-V" 270 do_req_rr_sizes 271 echo 272 } 273 274 udp_test() { 275 #Run the UDP RR tests 276 TEST="UDP_RR" 277 SEND_SIZE="" 278 SOCKET_SIZE="-s 9216 -S 9216" 279 COW="-V" 280 do_req_rr_sizes 281 echo 282 } 283 284 lla_test() { 285 #Run the UDP RR tests 286 TEST="HIPPI_RR" 287 SEND_SIZE="" 288 SOCKET_SIZE="" 289 COW="" 290 build_sap_list 291 do_req_rr_sizes 292 echo 293 } 294 295 do_req_procs() { 296 if [ $TCP -eq 1 ] 297 then 298 TESTNAME="TCP" 299 display_headstone 300 for PROCS in $NPROC_LIST 301 do 302 #Determine number of procs per host 303 PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` 304 NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` 305 tcp_test 306 done 307 fi 308 309 if [ $UDP -eq 1 ] 310 then 311 TESTNAME="UDP" 312 display_headstone 313 for PROCS in $NPROC_LIST 314 do 315 #Determine number of procs per host 316 PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` 317 NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` 318 udp_test 319 done 320 fi 321 322 if [ $LLA -eq 1 ] 323 then 324 TESTNAME="LLA" 325 display_headstone 326 for PROCS in $NPROC_LIST 327 do 328 #Determine number of procs per host 329 PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'` 330 NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS` 331 lla_test 332 done 333 fi 334 } 335 336 ###################################################################### 337 338 init_parms 339 340 PARMS="${0##*/} ${@}" 341 342 # Parse the command line 343 while [ $# != 0 ] 344 do 345 case $1 in 346 \-gprof) GPROF=1 347 GPROF_KERNEL=$2 348 shift 349 ;; 350 \-t) TEST_TIME=$2 351 shift 352 ;; 353 \-n) NPROC_LIST="$NPROC_LIST $2" 354 shift 355 ;; 356 \+lla) LLA=1 357 ;; 358 \+tcp) TCP=1 359 ;; 360 \+udp) UDP=1 361 ;; 362 \-lla) LLA=0 363 ;; 364 \-tcp) TCP=0 365 ;; 366 \-udp) UDP=0 367 ;; 368 \-d) DEVFILELIST="$DEVFILELIST $2" 369 shift 370 ;; 371 \-r) RR_SIZES="$RR_SIZES $2" 372 shift 373 ;; 374 \-*) usage $0: ERROR: Unexpected paramter: $1 375 exit 376 ;; 377 *) REM_HOST_LIST="$REM_HOST_LIST $1" 378 ;; 379 esac 380 shift 381 done 382 383 set_default_parms 384 check_usage 385 do_req_procs 386 387