]> johannes.truschnigg.info Git - sqm_lagthrottle/commitdiff
Implement measurement loop
authorJohannes Truschnigg <johannes@truschnigg.info>
Sat, 12 Mar 2022 12:53:54 +0000 (13:53 +0100)
committerJohannes Truschnigg <johannes@truschnigg.info>
Sat, 12 Mar 2022 12:53:54 +0000 (13:53 +0100)
__lagdetect.awk
lagdetect.sh

index 1593b8ab327481038b2fb3e3d1470cf2a789037a..6296f4789a5af20516b6ecbaee29d4bd1b4e5315 100644 (file)
@@ -1,14 +1,20 @@
 #!/usr/bin/awk -f
 BEGIN {
-  PINGSLOTS=5
+  print "THRESHOLD=" THRESHOLD
+  print "FUDGE=" FUDGE
+  print "PINGSLOTS=" SLOTS
   split(PING_PEERS, pps, " ")
   for (pp in pps) {
     pn = pps[pp]
     print "ping peer: " pn
     slotindex[pn]=0
+    have_baseline[pn]=0
+    ping_avgs[pn]=-1
+    ping_prev[pn]=-1
   }
 }
 
+
 # 1.1.1.1      : [0], 1288 bytes, 10.3 ms (10.3 avg, 0% loss)
 # 192.168.1.50 : [0], timed out (NaN avg, 100% loss)
 /[0-9] bytes, [0-9]*.[0-9]* ms / {
@@ -16,24 +22,52 @@ BEGIN {
   seq=$3
   bytes=$4
   lat=$6
-  #printf("%s %db in %.2fms\n", pn, bytes, lat)
-  slotindex[pn]++
-  pingslot=pn ":" slotindex[pn]
-  pingstats[pingslot]=lat
-
-  if(slotindex[pn] % PINGSLOTS == 0) {
-    # print "slotindex reset for " pn
-    slotindex[pn]=0
+  if (! (pn in slotindex)) {
+    print "BOGUS PEER: " pn
+    exit 1
   }
-  for (ps in pingstats) {
-    print ps " " pingstats[ps]
+  #printf("%s %db in %.2fms\n", pn, bytes, lat)
+  update_pingstats(pn, lat)
+  if(have_baseline[pn]) {
+    last2avg = (((ping_prev[pn] + lat) / 2.0))
+    thresh_fudged = (FUDGE + (ping_avgs[pn] * THRESHOLD))
+    if (last2avg > thresh_fudged ) {
+      print "LATENCY ++ " last2avg " " thresh_fudged " prev=" ping_prev[pn] " lat=" lat " host=" pn
+    } else {
+      print "LATENCY == " last2avg " " thresh_fudged " prev=" ping_prev[pn] " lat=" lat " host=" pn
+    }
+  } else {
+    # print "NODATA"
   }
+  ping_prev[pn]=lat
 }
 
+
 function update_pingstats(peername, latency) {
-print peername " at " latency
+  slotindex[peername]++
+  pingslot=peername ":" slotindex[peername]
+  pingstats[pingslot]=latency
+  if(slotindex[peername] % PINGSLOTS == 0) {
+    have_baseline[peername]=1
+    slotindex[peername]=0
+    update_ping_avgs(peername)
+    # print peername " avg " ping_avgs[peername] " cur " latency
+  }
+}
+
+
+function update_ping_avgs(peername) {
+  ping_sum = 0
+  for (k = 0; k<=PINGSLOTS; ++k) {
+    ps = peername ":" k
+    ping_sum += pingstats[ps]
+  }
+  ping_avg = ping_sum / PINGSLOTS
+  # print "AVG over " PINGSLOTS " samples for peer " peername " sum=" ping_sum " avg=" ping_avg
+  ping_avgs[pn] = ping_avg
 }
 
 
 END {
+  # Usually not reached.
 }
index 3329f2f03145565a69eb917054b4aa6f68b3939f..45224c36a45cf05cce047dd28ee4e5c63f84949f 100755 (executable)
@@ -1,6 +1,31 @@
 #!/bin/sh
+THRESHOLD=1.2
+FUDGE_MS=2.0
 PING_PEERS='1.1.1.1 8.8.8.8'
+PING_GW_IPV4=yes
+PING_GW_IPV6=no
+PING_SLOTS_PER_PEER=5
+PING_INTERVAL=500
 
-def_gw_v4=$(traceroute -n -m 1 1.1.1.1 | awk '{if("1" == $1){print $2}}')
 
-fping --loop --retry=1 --size=1280 --period=500 --random "${def_gw_v4}" ${PING_PEERS} | awk -v PING_PEERS="${def_gw_v4} ${PING_PEERS}" -f __lagdetect.awk
+
+
+#####################
+# DO NOT EDIT BELOW #
+#####################
+
+set -u
+for t in traceroute fping
+do
+type "$t" || exit 1
+done
+
+_def_gw_v4=$(traceroute -n -m 1 1.1.1.1 | awk '{if("1" == $1){print $2}}')
+
+fping --loop --retry=1 --size=1280 --period="${PING_INTERVAL}" --random "${_def_gw_v4}" ${PING_PEERS} 2>/dev/null \
+| awk \
+    -v THRESHOLD="${THRESHOLD}" \
+    -v PINGSLOTS="${PING_SLOTS_PER_PEER}" \
+    -v FUDGE="${FUDGE_MS}" \
+    -v PING_PEERS="${_def_gw_v4} ${PING_PEERS}" \
+    -f __lagdetect.awk