diff --git a/sched/watch_tcp b/sched/watch_tcp new file mode 100755 index 0000000000..3f4eedee6f --- /dev/null +++ b/sched/watch_tcp @@ -0,0 +1,119 @@ +#! /bin/csh +# +# by jeffc +# +# Usage : +# tcpstat [-t | -i interval] -w +# +# Options: +# -t given current counter totals +# -i interval sample at interval seconds and give counter rate +# -w watch_mode +# Default is -i 5 +# +# + +set usage = "usage: watch_tcp [-t | -i interval] -w" +set get_current_totals = 0 +set get_current_rates = 1 +set interval = 5 +set watch_mode = 0 +set drop_limit = 3 + +while ($#argv) + if ("$argv[1]" == "-t") then + set get_current_totals = 1 + set get_current_rates = 0 + else if ("$argv[1]" == "-i") then + set get_current_rates = 1 + set get_current_totals = 0 + shift + set interval = $argv[1] + else if ("$argv[1]" == "-w") then + set watch_mode = 1 + endif + + shift +end + +set now = `date '+%y:%m:%d:%H:%M:%S'` +set TMPFILE = /tmp/tcpstat.tmp.${now}.$$ +set DFILE = /tmp/tcpstat.tmp.delta.${now}.$$ +set DROPFILE = /tmp/DROPS + +if($get_current_totals) then + netstat -i -s -P tcp | sed -g s/=/\ / > $TMPFILE + + echo "" + echo "handshake queue max " `/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q0` + echo "ESTABLISHED queue max " `/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q` + echo "" + awk '{if($1 == "tcpOutDataSegs") print $1" "$2}' $TMPFILE + awk '{if($3 == "tcpOutDataBytes") print $3" "$4}' $TMPFILE + awk '{if($3 == "tcpPassiveOpens") print $3" "$4}' $TMPFILE + awk '{if($1 == "tcpListenDrop") print $1" "$2}' $TMPFILE + awk '{if($3 == "tcpListenDropQ0") print $3" "$4}' $TMPFILE + awk '{if($1 == "tcpHalfOpenDrop") print $1" "$2}' $TMPFILE + + \rm $TMPFILE + +else + + netstat -i -s -P tcp | sed -g s/=/\ / > $TMPFILE + sleep $interval + netstat -i -s -P tcp | sed -g s/=/\ / > $DFILE + + set ODS = `awk '{if($1 == "tcpOutDataSegs") print $2}' $TMPFILE` + set ODS5 = `awk '{if($1 == "tcpOutDataSegs") print $2}' $DFILE` + set ODB = `awk '{if($3 == "tcpOutDataBytes") print $4}' $TMPFILE` + set ODB5 = `awk '{if($3 == "tcpOutDataBytes") print $4}' $DFILE` + set PO = `awk '{if($3 == "tcpPassiveOpens") print $4}' $TMPFILE` + set PO5 = `awk '{if($3 == "tcpPassiveOpens") print $4}' $DFILE` + set LD = `awk '{if($1 == "tcpListenDrop") print $2}' $TMPFILE` + set LD5 = `awk '{if($1 == "tcpListenDrop") print $2}' $DFILE` + set LDQ0 = `awk '{if($3 == "tcpListenDropQ0") print $4}' $TMPFILE` + set LDQ05 = `awk '{if($3 == "tcpListenDropQ0") print $4}' $DFILE` + set HOD = `awk '{if($1 == "tcpHalfOpenDrop") print $2}' $TMPFILE` + set HOD5 = `awk '{if($1 == "tcpHalfOpenDrop") print $2}' $DFILE` + + @ ODS_rate = ($ODS5 - $ODS) / $interval + @ ODB_rate = ($ODB5 - $ODB) / $interval + @ PO_rate = ($PO5 - $PO) / $interval + @ LD_rate = ($LD5 - $LD) / $interval + @ LDQ0_rate = ($LDQ05 - $LDQ0) / $interval + @ HOD_rate = ($HOD5 - $HOD) / $interval + + if($watch_mode) then + echo INFO $now TCP Out B/s : $ODB_rate Listen drops/s : $LD_rate + if($LD_rate) then + if(-f $DROPFILE) then + set drop_count = `cat $DROPFILE` + @ drop_count++ + if($drop_count > $drop_limit) then + echo CRITICAL $now TCP dropping connections for $drop_count checks + endif + echo $drop_count > $DROPFILE + else + echo 1 > $DROPFILE + endif + else + if(-f $DROPFILE) then + rm $DROPFILE + endif + else + echo "" + echo "handshake queue max " `/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q0` + echo "ESTABLISHED queue max " `/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q` + echo "" + echo tcpOutDataSegs" "$ODS_rate per second + echo tcpOutDataBytes" "$ODB_rate per second + echo tcpPassiveOpens" "$PO_rate per second + echo tcpListenDrop" "$LD_rate per second + echo tcpListenDropQ0" "$LDQ0_rate per second + echo tcpHalfOpenDrop" "$HOD_rate per second + endif + + \rm $TMPFILE + \rm $DFILE +endif +