From: Johannes Truschnigg Date: Wed, 16 Mar 2022 21:05:04 +0000 (+0100) Subject: Implement RX bw steering X-Git-Url: https://johannes.truschnigg.info/gitweb/?a=commitdiff_plain;h=ebd9552150224429bab1a0430e98742d7b7b3fcd;p=sqm_lagthrottle Implement RX bw steering --- diff --git a/__lagdetect.awk b/__lagdetect.awk index ecbda77..ea3ade4 100644 --- a/__lagdetect.awk +++ b/__lagdetect.awk @@ -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") }