]> johannes.truschnigg.info Git - sqm_lagthrottle/commitdiff
Implement RX bw steering
authorJohannes Truschnigg <johannes@truschnigg.info>
Wed, 16 Mar 2022 21:05:04 +0000 (22:05 +0100)
committerJohannes Truschnigg <johannes@truschnigg.info>
Wed, 16 Mar 2022 21:05:04 +0000 (22:05 +0100)
__lagdetect.awk

index ecbda779a28aa5a42af44545240c93dedbdb2f0d..ea3ade4e2d92d1554a35f33e5ef31b0aa9c09358 100644 (file)
@@ -5,8 +5,8 @@ BEGIN {
   print "# THRESHOLD=" THRESHOLD
   print "# FUDGE=" FUDGE
   print "# PINGSLOTS=" PINGSLOTS
-  print "# BW_MAX=" BW_MAX
-  print "# BW_MIN=" BW_MIN
+  print "# BW_MAX_RX=" BW_MAX_RX
+  print "# BW_MIN_RX=" BW_MIN_RX
   print "# STATS_TX=" STATS_TX
   print "# IFACE_TX=" IFACE_TX
   print "# STATS_RX=" STATS_RX
@@ -23,6 +23,9 @@ BEGIN {
     ping_pprev[pn] = -1 # latency recorded in the previous cycle
     not_increasing_count[pn] = 0 # number of consecutive cycles with no (fudged) latency increase
   }
+  ts = get_time()
+  bw_next_step_rx = 1
+  slice_bw_window_rx(BW_MIN_RX, BW_MAX_RX)
   consec_timeouts = 0
   adjust_ts_delta = 0
   rx_rate_max = 100 # make something up
@@ -58,6 +61,23 @@ BEGIN {
 }
 
 
+function slice_bw_window_rx(bw_lower_bound_rx, bw_upper_bound_rx) {
+  bw_bound_delta_rx = (bw_upper_bound_rx - bw_lower_bound_rx)
+  bw_steps_rx = 1+int((log(bw_bound_delta_rx)/log(10)) ^ 1.6)
+  print "# STEPS_RX=" bw_steps_rx
+  for (k = 0; k <= bw_steps_rx; k++) {
+    STEPS_RX[k]=int((bw_lower_bound_rx + (k * (bw_bound_delta_rx / bw_steps_rx))))
+    print "# RX step #" k " = " STEPS_RX[k] "Kbps "
+  }
+  k--
+  print "# MAX INDEX " k
+  bw_maxindex_rx = k
+  bw_next_step_rx = k
+  bw_cur_step_rx = k
+  set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+}
+
+
 function update_ts() {
   ts = get_time()
   ts_delta = ts - ts_old
@@ -141,8 +161,8 @@ function adjust_sqm(peername, latency) {
   # Assume links are clogged, so we short-circuit a bandwidth decrease
   if (consec_timeouts > ((1.5 * peer_count) + 2)) {
     # print "# " ts " too many TIMEOUTS in a row, decreasing SQM bw"
-    set_bw(IFACE_RX, 5000)
-    set_bw(IFACE_TX, 5000)
+    bw_cur_step_rx = 0
+    set_bw(IFACE_RX, STEPS_RX[bw_cur_step_rx]) # XXX TODO
     return
   }
 
@@ -153,32 +173,42 @@ function adjust_sqm(peername, latency) {
   }
 
   # XXX this logic needs fixing
-  if ( rx_rate < (rx_rate_max * 0.1) || tx_rate < (tx_rate_max * 0.1) ) {
-    # print "line does not appear to be loaded, skipping SQM update"
-    return
-  }
+  # if ( rx_rate < (rx_rate_max * 0.1) || tx_rate < (tx_rate_max * 0.1) ) {
 
   # Try to determine the latency trend over the last few samples
   last2avg = (((ping_prev[peername] + latency) / 2.0))
   thresh_fudged = (FUDGE + (ping_avgs[peername] * THRESHOLD))
   if (last2avg > thresh_fudged ) {
     if (latency > ping_prev[peername] && latency > ping_pprev[peername]) {
+      if ( rx_rate < (rx_rate_max * 0.1)) {
+        print "# " ts " line does not appear to be loaded, skipping SQM bw downgrade"
+      } else {
       # print ts " " adjust_ts_delta " CONSIDER BW DECREASE # " peername " lat=" latency " prev=" ping_prev[peername] " pprev=" ping_pprev[peername] " avg=" ping_avgs[peername] " min=" ping_min[peername]
-      set_bw(IFACE_TX, 5000)
-      set_bw(IFACE_RX, 5000)
+        if (bw_cur_step_rx > 0) {
+          bw_next_step_rx = bw_cur_step_rx - 1
+          print "# --- " ts " choosing bw rx step " bw_next_step_rx "  := " STEPS_RX[bw_next_step_rx] "Kbps"
+          set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+          bw_cur_step_rx = bw_next_step_rx
+        } else {
+          print "# already at lowest bw rx step " bw_cur_step_rx
+        }
+      }
       # print "set adjust_old=" ts
       adjust_old = ts
     }
     not_increasing_count[peername]=0
-  } else if ((latency < FUDGE + ping_avgs[peername]) &&
-             latency < ping_prev[peername] &&
-            latency < ping_pprev[peername] &&
-            ping_prev[peername] < ping_pprev[peername]) {
+  } else if (latency < ping_prev[peername] && latency < ping_pprev[peername] && ping_prev[peername] < ping_pprev[peername]) {
     if (not_increasing_count[peername] > (5 * PINGSLOTS)) {
       # print ts " " adjust_ts_delta " CONSIDER BW INCREASE # " peername " lat=" latency " prev=" ping_prev[peername] " pprev=" ping_pprev[peername] " avg=" ping_avgs[peername] " min=" ping_min[peername]
+      if (bw_cur_step_rx < bw_maxindex_rx) {
+        bw_next_step_rx = bw_cur_step_rx + 1
+        print "# +++ choosing " ts " bw rx step " bw_next_step_rx "  := " STEPS_RX[bw_next_step_rx] "Kbps"
+        set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+        bw_cur_step_rx = bw_next_step_rx
+      } else {
+        print "# already at highest bw rx step " bw_cur_step_rx
+      }
       not_increasing_count[peername]=0
-      set_bw(IFACE_TX, 10000)
-      set_bw(IFACE_RX, 10000)
       adjust_old = ts
     }
     not_increasing_count[peername]++
@@ -228,7 +258,7 @@ function update_ping_avgs(peername) {
 
 function set_bw(dev, kbit) {
   #print "# BW CHANGE dev=" dev " kbit=" kbit
-  system("echo COMMAND " ts " tc qdisc change root dev " dev " cake bandwidth " kbit "Kbit")
+  system("set -x; : " ts "; tc qdisc change root dev " dev " cake bandwidth " kbit "Kbit")
 }