From: Johannes Truschnigg Date: Sat, 12 Mar 2022 12:53:54 +0000 (+0100) Subject: Implement measurement loop X-Git-Url: https://johannes.truschnigg.info/gitweb/?a=commitdiff_plain;h=b1f17f88be190516dad5956bb7462a6bdea39ef7;p=sqm_lagthrottle Implement measurement loop --- diff --git a/__lagdetect.awk b/__lagdetect.awk index 1593b8a..6296f47 100644 --- a/__lagdetect.awk +++ b/__lagdetect.awk @@ -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. } diff --git a/lagdetect.sh b/lagdetect.sh index 3329f2f..45224c3 100755 --- a/lagdetect.sh +++ b/lagdetect.sh @@ -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