CAKE w/ Adaptive Bandwidth [August 2022 to March 2024]

I thought delta_delay is already baseline corrected, so what do we gain from subtracting baseline again? Basing the acceptable variance on the threshold (or adjusted_threshold?) seems like a decent idea, no intuition what proportionality factor to use here though, so starting with 0.9 is just as good as any other...

We can, but than we are restarting ping/fping/... at 1Hz which seems a bit off... if we pre-qualify our reflector candidates we might not need too fast a test rate, also to get better estimates of a reflectors statistics (EWMA(delta_delay)) we need to collect a number of samples per reflector with high interleaving we might only collect a sample per reflector and second...

I would only go to such extremes if we have data showing that is required, as is I see that our CDFs are either reasonably similar or prime candidates for recycling. :wink:

Let's not over do this unless we need to, ATM we do neither reject reflectors based on baseline of variance spread and we are doing pretty well, so let's introduce changes gently ;).
The thing is if we enforce too strict baseline or variance requirements we are likely to end up with reflectors pretty much sharing much of their path, which is not what we ideally want (ideally they should just share the bottleneck link we want to control). That is why I argue for working with rather looser requirements to bias against large baseline and variance but not to reduce either measure too harshly. We want as you say "low baselines and also low mids" but not too low :wink:

No idea, time to play with some values?

2 Likes

OK - I think I have enough to code something up when I get a chance now. Thanks for your patience!

By the way @moeller0 there may be a very legitimate reason for doing something like making delta threshold dependent on reflector behaviour because for some inexplicable reason my Vodafone 4G connection sometimes now sees unloaded pings like this:

Reply from 1.1.1.1: bytes=32 time=110ms TTL=58
Reply from 1.1.1.1: bytes=32 time=114ms TTL=58
Reply from 1.1.1.1: bytes=32 time=108ms TTL=58
Reply from 1.1.1.1: bytes=32 time=123ms TTL=58
Reply from 1.1.1.1: bytes=32 time=112ms TTL=58
Reply from 1.1.1.1: bytes=32 time=97ms TTL=58

Ping statistics for 1.1.1.1:
    Packets: Sent = 774, Received = 770, Lost = 4 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 53ms, Maximum = 136ms, Average = 98ms

And of course cake-autorate pins it down to 5 Mbit/s because at this range the pingers/reflectors are continually triggering. And although the ping has rocketed up from the normal circa 35ms to circa 100ms, the available bandwidth without SQM is pretty hefty even now at circa 4pm UK time:

I'm not exactly sure what's going on here but perhaps the spread of my RTT even between modem and first ISP hop is non-static with time affecting everything?

I presume if the delta_thr were to be set based on minimum and delta that such temporal variation could be accounted for?

Here is some data (without SQM):

I think the above shows that the DL_ADJ_DELAY_THR (yellow line) is set too low because the DL_OWD_DELTA_US regularly traverses it (but this was not bufferbloat related). But I have been using this delta threshold for quite some time, so I think this shows how the DL_ADJ_DELAY_THR may need to dynamically adjust to reflect changes in the connection. I'm not sure how that dynamic adjustment could be implemented but assuming this is needed then I'd welcome ideas.

Here is some data (with SQM and where we see the pinning to 5Mbit/s):

I have acquired some resources in a datacenter. Holy cow, did I get some wildly varying results from their fabric, yesterday, no matter the underlying qdisc. Do a:

rsync -av lqos.taht.net::p2p-tests .

and scratch your head for a while.

Goal is with these boxes to push the limits of what can be done with cake (see: https://libreqos.io), and a secondary goal might be to also add in active measurements like those on this thread to compensate... and a third goal is to get this little cluster to behave sanely on this fabric. That should be the first goal, I admit, but I imagine a lot of underlying SDN networks are actually behaving like this in the first place.

I'm also planning on trying to get openwrt running on one of the 32 core boxes to see what happens. :slight_smile: Fun times in hardware land.... If anyone wants to play with us, you can find me @dtaht:matrix.org....

2 Likes

I think to 'tackle' this issue you would need to increase the baseline learning rate, that is increase the weight of the current sample in the baselene EWMA. This looks like a fluctuating baseline more than requiring a dynamic threshold.... dynamic threshold beyond the current adjustments is a bit tricky as it should not be necessary given what we try to model here.
Making the badeline estimate nimbler also has its own issues but seems less problematik to me.

Could this be a reason to reconsider switching over to just using simple moving average for baseline as per:

At present we have:

rtt_delta_us=$(( $rtt_us-$rtt_baseline_us ))

alpha=$(( (( $rtt_delta_us >=0 )) ? $alpha_baseline_increase : $alpha_baseline_decrease ))

rtt_baseline_us=$(( ( (1000-$alpha)*$rtt_baseline_us+$alpha*$rtt_us )/1000 ))

dl_owd_baseline_us=$(($rtt_baseline_us/2))
ul_owd_baseline_us=$dl_owd_baseline_us

And for alpha values we have:

# RTT baseline against which to measure delays
# the idea is that the baseline is allowed to increase slowly to allow for path changes
# and slowly enough such that bufferbloat will be corrected well before the baseline increases,
# but it will decrease very rapidly to ensure delays are measured against the shortest path
alpha_baseline_increase=0.001 # how rapidly baseline RTT is allowed to increase
alpha_baseline_decrease=0.9   # how rapidly baseline RTT is allowed to decrease

And SMA would look something like:

[Initial fill up of /tmp/SMA_fifo with Z values + determination of initial average]
[ .. and then for each ping result]
echo $rtt > /tmp/SMA_fifo
rtt_oldest = read 1st line from /tmp/SMA_fifo
rtt_baseline = rtt_baseline + (1/Z)*(rtt - rtt_oldest)

Not sure, making badeline less persistent or not resetting it fast on sampleRTT > baseline, will make our controller more prone to interpret longer duration bufferbloat/congestion as the 'new normal'. This will recover throughput but at the cost of increased latency. I would think we already have enough toggles to bias for higher throughput if desired, like increasing the threshold or adjusting the baseline faster. Making any of this automatic requires us to find a way of differentiating quickly and reliably between 'bad' and 'tolerable'.

Here is a 20 point SMA on the 8.8.8.8 data (ping interval 0.5s per reflector, so SMA over 10s of data I think?):

I've also put in the EWMA delta and SMA delta.

Here is another one from the .gz data I linked above:

What do you think?

Perhaps I need to repeat this exercise with actual bufferbloat since the above involved retention of bandwidth at 5 Mbit/s despite non-SQM bandwidth being in the region of 60 Mbit/s.

But the situation was clearly hopeless in the second graph - perpetual triggering!

1 Like

That is not solving our problem :wink: You will get a similar result if you run an EWMA with lots of weight for the most recent value, both suffer from the fact that they will incorporate sustained delay due to true bufferbloat far too readily. The time constant of the EWMA or the window length of an SMA need to be selected such that our baseline does not increase too fast, once you do that however the "nice" tracking low/pass behaviour visible in your plots shifts to much lower frequencies.

That is quite something to behold... what are all the *mq variants?
All these "ramps" in the latency panels are puzzling, what do you think causes these?

So here is a post that shows SMA (labeled mean) and EWMA:
https://medium.com/codex/simple-moving-average-and-exponentially-weighted-moving-average-with-pandas-57d4a457d363
https://miro.medium.com/max/1400/1*Bvh-sO5JnjRqhw2h-_Iu1g.webp
and
https://miro.medium.com/max/1400/1*4qGHG21hLY--QKLniwdrGQ.webp

Note how similar these can be depending on the selection of the EWMA alpha?

And here a plot showing examples of how much an EWMA diverges (filters) from the input data depending on alpha:
https://miro.medium.com/max/1400/1*bfTSYaygQCxfr_Ve5tbf0A.webp

In short I do not think that SMA versus EWMA is going to help us much, plus the SMAs are centered on the mean of the delay data, while for baseline we really would like a moving minimum (which we get with the EWMAs by resetting quickly to encountered minima*)... Now if you calculate SMA you can just as easily calculate SMMinimum, but I think the real question is over what number of RTT samples to operate (which for EWMA is more or less equivalent with what alpha to select).

Side-note: with our default values we really do not use the EWMA to low pass filter the RTT in data in any meaningful way, we just use it as a means to sloooowly update our baseline estimates to eventually adapt to path changes that affect the baseline, as we operate in the principle that baseline represents that invariable component of the delay. In your case we could argue that either the network path fluctuates and hence the "invariable" term has some short term variability OR we could argue that there is an additional process in play that our current model "static" baseline + purely bufferbloat-driven deltaDelay does not capture well. In that interpretation a possible solution would lie in trying to first understand this additional delay-changing process first and then add it to our "model". I think my initial proposal to fudge the alpha is merely a work-around but no real solution. Your approach to adjust the threshold might have actually more merit in that it appears we have a process that affects the sample RTTs more than the baseline (as this component varies at timeframes incompatible with true changes of the network path). Intuitively I would (if I understood the root cause better) try to model this as an additional component to calculate the deltaDelay instead of changing the threshold but that is more a matter of taste and implementation than principle. So is there any rhyme or reason tho the fluctuations you see?
Just to throw something out, we could keep our existing conservative minimum corrected baseline and add another EWMA on top that tries to correct for intermediate time scale variations and then have the deltaDelay on top. Though that really just shifts the problem around as long as one of our three components will confuse true congestion with expected/acceptable delay increases our controller will loose sensitivity to congestion.

*) something like this could also be introduced to SMA style calculation e.g. by maintaining a common factor to multiply all values (and/or a common additive/subtractive term) before averaging with, but I am not sure whether that is going to be noticeably better than simple EWMAs which are pretty simple to maintain and use minimal state... to be explicit EWMA and SMA are not going to be exactly equal for any relationship between the SMA's N and the EWMA's alpha, but I argue that the fine-scale differences do not matter for our use-case.

Maybe try with EWMA alpha set to 2 / (20 + 1) = 0.095 which should have a similar center of mass to a 20 point SMA (since I forgot how we defined the EWMA factors you might need t specify (1 - (2 / (20 + 1) )) = 0.905. and maybe disable the reset to minimum logic.

1 Like

Thanks. Very insightful as ever. Last night I coded up an SMA implementation (just a few lines and some trickery relating to setting up an array of arrays). Snippet here:

rtt_delta_us=$(( $rtt_us-${rtt_baselines_us[$reflector]} ))

declare -n reflector_rtts_us="reflector_${reflector//./_}_rtts_us"
declare -n reflector_rtts_idx="reflector_${reflector//./_}_rtts_idx"

reflector_rtts_us[$reflector_rtts_idx]=$rtt_us

rtt_baselines_us[$reflector]=$((${rtt_baselines_us[$reflector]}+($rtt_us-${reflector_rtts_us[((($reflector_rtts_idx+1)%$rtts_sma_period))]})/$rtts_sma_period))

((reflector_rtts_idx=(reflector_rtts_idx+1)%$rtts_sma_period))

And from my testing so far including various plots in Excel I think it works. At least it works for a while, but something seems not quite right since after a night of running one of the baselines went negative(!) - so there is something I've missed that I will need to iron out. But once I have fixed that we can then easily test both side by side.

I can likely share data today from the SMA code since I'm running the revised code as a service to see how it feels, albeit serious testing to compare SMA and EWMA may need to wait until tomorrow.

Here are a couple of waveform tests:

I wonder if an issue is that increased variance hurts more when tracking the minimum than it does when tracking the middle? I have tried to illustrate what I have in my mind below.

Here is the effect of increased variance:

Now of course this doesn't mean SMA is better than EWMA, just that the way we've implemented the EWMA so far may mean that variance hurts more than with my SMA tracking the middle.

In any case, I am thinking with a 20 point SMA and 0.5s between reflector responses (since playing with the reflector randomisation I have been using 10 reflectors to keep a 20 Hz response interval), this corresponds with a 10s SMA period and so surely that offers quite some resilience to the problem of baseline creep with bufferbloat? If the bufferbloat lasts long enough to make a big difference over this period then isn't there something rather wrong?

Can you see what I've done wrong here:

.. that could result in a negative baseline after a long time of running (perhaps with reflector replacement)?

I see it here:

LOAD; 2022-11-25-10:26:13; 1669371973.121759; 1669371973.121248; 417; 649
LOAD; 2022-11-25-10:26:13; 1669371973.324547; 1669371973.323871; 2267; 611
LOAD; 2022-11-25-10:26:13; 1669371973.525108; 1669371973.524582; 4308; 170
LOAD; 2022-11-25-10:26:13; 1669371973.726920; 1669371973.726408; 817; 172
LOAD; 2022-11-25-10:26:13; 1669371973.929054; 1669371973.928148; 2400; 378
LOAD; 2022-11-25-10:26:14; 1669371974.130361; 1669371974.129842; 4514; 144
DEBUG; 2022-11-25-10:26:14; 1669371974.330131; dl load percent: 90 or ul load percent: 2 exceeded medium load threshold percent: 75. Resuming normal operation.
LOAD; 2022-11-25-10:26:14; 1669371974.332734; 1669371974.332321; 773; 241
rtt_baselines_us[9.9.9.9]=5540+(56000-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.510021; 1669371974.509350; 773; 241; 15; 4; 1669371974.498030; 9.9.9.9; 0; 2920; 28000; 25230; 17547; 2920; 28000; 25230; 17547; 6; 6; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:14; 1669371974.531754; 1669371974.531512; 3931; 187
rtt_baselines_us[208.67.220.220]=20130+(60500-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.565479; 1669371974.564851; 3931; 187; 78; 3; 1669371974.552960; 208.67.220.220; 0; 10327; 30250; 20185; 17547; 10327; 30250; 20185; 17547; 7; 7; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-15835+(38900-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.592012; 1669371974.591343; 3931; 187; 78; 3; 1669371974.581420; 94.140.14.15; 0; -8195; 19450; 27367; 17547; -8195; 19450; 27367; 17547; 7; 7; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=5165+(49900-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.655023; 1669371974.654228; 3931; 187; 78; 3; 1669371974.642540; 156.154.71.4; 0; 2580; 24950; 22367; 17547; 2580; 24950; 22367; 17547; 7; 7; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6940+(46900-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.703962; 1669371974.703266; 3931; 187; 78; 3; 1669371974.689560; 156.154.71.5; 0; 3392; 23450; 19980; 17547; 3392; 23450; 19980; 17547; 7; 7; dl_high_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:14; 1669371974.732114; 1669371974.731910; 1917; 264
rtt_baselines_us[185.228.168.10]=-520+(44800-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.751145; 1669371974.749094; 1917; 264; 38; 5; 1669371974.737630; 185.228.168.10; 0; -390; 22400; 22660; 17547; -390; 22400; 22660; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=9230+(78900-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.838058; 1669371974.837181; 1917; 264; 38; 5; 1669371974.821810; 94.140.15.16; 0; 5337; 39450; 34835; 17547; 5337; 39450; 34835; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.70.5]=38730+(52700-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.853859; 1669371974.853441; 1917; 264; 38; 5; 1669371974.845960; 156.154.70.5; 0; 19432; 26350; 6985; 17547; 19432; 26350; 6985; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=8095+(50400-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.905600; 1669371974.905180; 1917; 264; 38; 5; 1669371974.893800; 156.154.71.1; 0; 4057; 25200; 21152; 17547; 4057; 25200; 21152; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:14; 1669371974.935008; 1669371974.934230; 3192; 302
rtt_baselines_us[94.140.14.141]=-9865+(52100-50000)/20
DATA; 2022-11-25-10:26:14; 1669371974.957712; 1669371974.957230; 3192; 302; 63; 6; 1669371974.945580; 94.140.14.141; 0; -4880; 26050; 30982; 17547; -4880; 26050; 30982; 17547; 9; 9; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=5840+(59500-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.018361; 1669371975.017048; 3192; 302; 63; 6; 1669371975.003120; 9.9.9.9; 1; 3157; 29750; 26830; 17547; 3157; 29750; 26830; 17547; 9; 9; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=20655+(59800-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.067428; 1669371975.066749; 3192; 302; 63; 6; 1669371975.053490; 208.67.220.220; 1; 10572; 29900; 19572; 17547; 10572; 29900; 19572; 17547; 9; 9; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-16390+(38400-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.091936; 1669371975.091555; 3192; 302; 63; 6; 1669371975.082170; 94.140.14.15; 1; -8485; 19200; 27395; 17547; -8485; 19200; 27395; 17547; 9; 9; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:15; 1669371975.136470; 1669371975.136080; 4460; 204
rtt_baselines_us[156.154.71.4]=5160+(52000-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.155806; 1669371975.155319; 4460; 204; 89; 4; 1669371975.145930; 156.154.71.4; 1; 2630; 26000; 23420; 17547; 2630; 26000; 23420; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6785+(52700-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.211554; 1669371975.210909; 4460; 204; 89; 4; 1669371975.196870; 156.154.71.5; 1; 3460; 26350; 22957; 17547; 3460; 26350; 22957; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-780+(46700-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.254947; 1669371975.253707; 4460; 204; 89; 4; 1669371975.240980; 185.228.168.10; 1; -472; 23350; 23740; 17547; -472; 23350; 23740; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=10675+(74000-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.333029; 1669371975.332642; 4460; 204; 89; 4; 1669371975.318450; 94.140.15.16; 1; 5937; 37000; 31662; 17547; 5937; 37000; 31662; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:15; 1669371975.336288; 1669371975.336048; 4447; 190
rtt_baselines_us[156.154.70.5]=38865+(55200-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.359998; 1669371975.359361; 4447; 190; 88; 3; 1669371975.349890; 156.154.70.5; 1; 19562; 27600; 8167; 17547; 19562; 27600; 8167; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=8115+(46900-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.399788; 1669371975.399406; 4447; 190; 88; 3; 1669371975.391640; 156.154.71.1; 1; 3980; 23450; 19392; 17547; 3980; 23450; 19392; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.141]=-9760+(36700-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.441791; 1669371975.441158; 4447; 190; 88; 3; 1669371975.431530; 94.140.14.141; 1; -5212; 18350; 23230; 17547; -5212; 18350; 23230; 17547; 9; 9; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=6315+(39600-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.498632; 1669371975.497758; 4447; 190; 88; 3; 1669371975.484550; 9.9.9.9; 2; 2897; 19800; 16642; 17547; 2897; 19800; 16642; 17547; 8; 8; dl_high_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=21145+(41600-50000)/20
LOAD; 2022-11-25-10:26:15; 1669371975.539497; 1669371975.538987; 270; 61
DATA; 2022-11-25-10:26:15; 1669371975.555042; 1669371975.553904; 270; 61; 5; 1; 1669371975.536680; 208.67.220.220; 2; 10362; 20800; 10227; 17547; 10362; 20800; 10227; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-16970+(52700-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.609338; 1669371975.608706; 270; 61; 5; 1; 1669371975.597860; 94.140.14.15; 2; -8417; 26350; 34835; 17547; -8417; 26350; 34835; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=5260+(53800-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.661462; 1669371975.660822; 270; 61; 5; 1; 1669371975.649430; 156.154.71.4; 2; 2725; 26900; 24270; 17547; 2725; 26900; 24270; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6920+(54800-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.713047; 1669371975.712567; 270; 61; 5; 1; 1669371975.700440; 156.154.71.5; 2; 3580; 27400; 23940; 17547; 3580; 27400; 23940; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-945+(41800-50000)/20
LOAD; 2022-11-25-10:26:15; 1669371975.739822; 1669371975.739435; 945; 246
DATA; 2022-11-25-10:26:15; 1669371975.749727; 1669371975.749088; 945; 246; 18; 4; 1669371975.737580; 185.228.168.10; 2; -677; 20900; 21372; 17547; -677; 20900; 21372; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=11875+(63700-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.826349; 1669371975.825872; 945; 246; 18; 4; 1669371975.809620; 94.140.15.16; 2; 6280; 31850; 25912; 17547; 6280; 31850; 25912; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.70.5]=39125+(59400-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.868104; 1669371975.867627; 945; 246; 18; 4; 1669371975.855660; 156.154.70.5; 2; 19797; 29700; 10137; 17547; 19797; 29700; 10137; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7960+(44200-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.904675; 1669371975.903644; 945; 246; 18; 4; 1669371975.890520; 156.154.71.1; 2; 3835; 22100; 18120; 17547; 3835; 22100; 18120; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:15; 1669371975.940709; 1669371975.940328; 373; 321
rtt_baselines_us[94.140.14.141]=-10425+(47200-50000)/20
DATA; 2022-11-25-10:26:15; 1669371975.954478; 1669371975.953947; 373; 321; 7; 6; 1669371975.943640; 94.140.14.141; 2; -5282; 23600; 28812; 17547; -5282; 23600; 28812; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=5795+(46900-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.005532; 1669371976.004896; 373; 321; 7; 6; 1669371975.993630; 9.9.9.9; 3; 2820; 23450; 20552; 17547; 2820; 23450; 20552; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=20725+(55900-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.068915; 1669371976.068224; 373; 321; 7; 6; 1669371976.052740; 208.67.220.220; 3; 10510; 27950; 17587; 17547; 10510; 27950; 17587; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-16835+(46900-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.102102; 1669371976.101712; 373; 321; 7; 6; 1669371976.094080; 94.140.14.15; 3; -8495; 23450; 31867; 17547; -8495; 23450; 31867; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=5450+(40300-50000)/20
LOAD; 2022-11-25-10:26:16; 1669371976.142451; 1669371976.141901; 1678; 288
DATA; 2022-11-25-10:26:16; 1669371976.151984; 1669371976.151472; 1678; 288; 33; 5; 1669371976.137560; 156.154.71.4; 3; 2482; 20150; 17425; 17547; 2482; 20150; 17425; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=7160+(49300-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.215052; 1669371976.213924; 1678; 288; 33; 5; 1669371976.196670; 156.154.71.5; 3; 3562; 24650; 21070; 17547; 3562; 24650; 21070; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-1355+(48900-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.260045; 1669371976.259410; 1678; 288; 33; 5; 1669371976.249460; 185.228.168.10; 3; -705; 24450; 25127; 17547; -705; 24450; 25127; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=12560+(58600-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.327019; 1669371976.326542; 1678; 288; 33; 5; 1669371976.312560; 94.140.15.16; 3; 6495; 29300; 23020; 17547; 6495; 29300; 23020; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:16; 1669371976.342129; 1669371976.341835; 473; 53
rtt_baselines_us[156.154.70.5]=39595+(49200-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.362335; 1669371976.361862; 473; 53; 9; 1; 1669371976.353580; 156.154.70.5; 3; 19777; 24600; 4802; 17547; 19777; 24600; 4802; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7670+(47200-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.416740; 1669371976.416345; 473; 53; 9; 1; 1669371976.401640; 156.154.71.1; 3; 3765; 23600; 19765; 17547; 3765; 23600; 19765; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.141]=-10565+(41100-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.456863; 1669371976.456310; 473; 53; 9; 1; 1669371976.446630; 94.140.14.141; 3; -5505; 20550; 25832; 17547; -5505; 20550; 25832; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=5640+(47800-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.517199; 1669371976.516563; 473; 53; 9; 1; 1669371976.503950; 9.9.9.9; 4; 2765; 23900; 21080; 17547; 2765; 23900; 21080; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:16; 1669371976.542903; 1669371976.542607; 750; 82
rtt_baselines_us[208.67.220.220]=21020+(42500-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.560805; 1669371976.560168; 750; 82; 15; 1; 1669371976.549590; 208.67.220.220; 4; 10322; 21250; 10740; 17547; 10322; 21250; 10740; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-16990+(51800-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.623863; 1669371976.622909; 750; 82; 15; 1; 1669371976.609030; 94.140.14.15; 4; -8450; 25900; 34395; 17547; -8450; 25900; 34395; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=4965+(53300-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.676389; 1669371976.675571; 750; 82; 15; 1; 1669371976.660830; 156.154.71.4; 4; 2565; 26650; 24167; 17547; 2565; 26650; 24167; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=7125+(39800-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.706764; 1669371976.706289; 750; 82; 15; 1; 1669371976.697500; 156.154.71.5; 4; 3307; 19900; 16337; 17547; 3307; 19900; 16337; 17547; 7; 7; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:16; 1669371976.746183; 1669371976.745651; 2763; 631
rtt_baselines_us[185.228.168.10]=-1410+(45800-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.764122; 1669371976.763644; 2763; 631; 55; 12; 1669371976.753620; 185.228.168.10; 4; -810; 22900; 23605; 17547; -810; 22900; 23605; 17547; 7; 7; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=12990+(47600-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.820695; 1669371976.820309; 2763; 631; 55; 12; 1669371976.805550; 94.140.15.16; 4; 6435; 23800; 17305; 17547; 6435; 23800; 17305; 17547; 6; 6; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.70.5]=39555+(51400-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.871725; 1669371976.870850; 2763; 631; 55; 12; 1669371976.859450; 156.154.70.5; 4; 19812; 25700; 5922; 17547; 19812; 25700; 5922; 17547; 6; 6; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7530+(55400-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.929708; 1669371976.929238; 2763; 631; 55; 12; 1669371976.913780; 156.154.71.1; 4; 3900; 27700; 23935; 17547; 3900; 27700; 23935; 17547; 6; 6; dl_low_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:16; 1669371976.945738; 1669371976.945500; 354; 267
rtt_baselines_us[94.140.14.141]=-11010+(43100-50000)/20
DATA; 2022-11-25-10:26:16; 1669371976.960033; 1669371976.959540; 354; 267; 7; 5; 1669371976.951540; 94.140.14.141; 4; -5677; 21550; 27055; 17547; -5677; 21550; 27055; 17547; 6; 6; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=5530+(54900-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.029788; 1669371977.028846; 354; 267; 7; 5; 1669371977.013480; 9.9.9.9; 5; 2887; 27450; 24685; 17547; 2887; 27450; 24685; 17547; 6; 6; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=20645+(54600-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.075457; 1669371977.074221; 354; 267; 7; 5; 1669371977.063480; 208.67.220.220; 5; 10437; 27300; 16977; 17547; 10437; 27300; 16977; 17547; 6; 6; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-16900+(40500-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.106740; 1669371977.106101; 354; 267; 7; 5; 1669371977.099500; 94.140.14.15; 5; -8687; 20250; 28700; 17547; -8687; 20250; 28700; 17547; 6; 6; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:17; 1669371977.147749; 1669371977.146600; 193; 163
rtt_baselines_us[156.154.71.4]=5130+(46400-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.164414; 1669371977.163880; 193; 163; 3; 3; 1669371977.155520; 156.154.71.4; 5; 2475; 23200; 20635; 17547; 2475; 23200; 20635; 17547; 6; 6; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6615+(54700-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.225154; 1669371977.224507; 193; 163; 3; 3; 1669371977.213950; 156.154.71.5; 5; 3425; 27350; 24042; 17547; 3425; 27350; 24042; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-1620+(46200-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.271875; 1669371977.270314; 193; 163; 3; 3; 1669371977.255510; 185.228.168.10; 5; -905; 23100; 23910; 17547; -905; 23100; 23910; 17547; 7; 7; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=12870+(60000-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.330497; 1669371977.330004; 193; 163; 3; 3; 1669371977.319500; 94.140.15.16; 5; 6685; 30000; 23565; 17547; 6685; 30000; 23565; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:17; 1669371977.347815; 1669371977.347524; 851; 232
rtt_baselines_us[156.154.70.5]=39625+(47600-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.366519; 1669371977.366035; 851; 232; 17; 4; 1669371977.357470; 156.154.70.5; 5; 19752; 23800; 3987; 17547; 19752; 23800; 3987; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7800+(55700-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.435113; 1669371977.434144; 851; 232; 17; 4; 1669371977.415670; 156.154.71.1; 5; 4042; 27850; 23950; 17547; 4042; 27850; 23950; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.141]=-11355+(48200-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.466268; 1669371977.465592; 851; 232; 17; 4; 1669371977.458490; 94.140.14.141; 5; -5722; 24100; 29777; 17547; -5722; 24100; 29777; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=5775+(62500-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.535094; 1669371977.534308; 851; 232; 17; 4; 1669371977.523530; 9.9.9.9; 6; 3200; 31250; 28362; 17547; 3200; 31250; 28362; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:17; 1669371977.547973; 1669371977.547736; 443; 887
rtt_baselines_us[208.67.220.220]=20875+(76200-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.604939; 1669371977.603995; 443; 887; 8; 17; 1669371977.587530; 208.67.220.220; 6; 11092; 38100; 27662; 17547; 11092; 38100; 27662; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-17375+(52100-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.621401; 1669371977.621052; 443; 887; 8; 17; 1669371977.613430; 94.140.14.15; 6; -8635; 26050; 34737; 17547; -8635; 26050; 34737; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=4950+(50100-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.677450; 1669371977.677058; 443; 887; 8; 17; 1669371977.661640; 156.154.71.4; 6; 2477; 25050; 22575; 17547; 2477; 25050; 22575; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6850+(43800-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.717520; 1669371977.717040; 443; 887; 8; 17; 1669371977.705530; 156.154.71.5; 6; 3270; 21900; 18475; 17547; 3270; 21900; 18475; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:17; 1669371977.749484; 1669371977.749103; 631; 1511
rtt_baselines_us[185.228.168.10]=-1810+(51700-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.772505; 1669371977.772027; 631; 1511; 12; 30; 1669371977.763600; 185.228.168.10; 6; -862; 25850; 26755; 17547; -862; 25850; 26755; 17547; 9; 9; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=13370+(53400-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.830836; 1669371977.830445; 631; 1511; 12; 30; 1669371977.815590; 94.140.15.16; 6; 6770; 26700; 20015; 17547; 6770; 26700; 20015; 17547; 9; 9; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.70.5]=39505+(58200-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.881255; 1669371977.880621; 631; 1511; 12; 30; 1669371977.870550; 156.154.70.5; 6; 19957; 29100; 9347; 17547; 19957; 29100; 9347; 17547; 9; 9; dl_low_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=8085+(50100-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.922685; 1669371977.922054; 631; 1511; 12; 30; 1669371977.912520; 156.154.71.1; 6; 4045; 25050; 21007; 17547; 4045; 25050; 21007; 17547; 9; 9; dl_low_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:17; 1669371977.950623; 1669371977.950315; 163; 765
rtt_baselines_us[94.140.14.141]=-11445+(43000-50000)/20
DATA; 2022-11-25-10:26:17; 1669371977.968144; 1669371977.967480; 163; 765; 3; 15; 1669371977.955600; 94.140.14.141; 6; -5897; 21500; 27222; 17547; -5897; 21500; 27222; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=6400+(70800-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.048422; 1669371978.047564; 163; 765; 3; 15; 1669371978.033530; 9.9.9.9; 7; 3720; 35400; 32200; 17547; 3720; 35400; 32200; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=22185+(66500-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.098952; 1669371978.098462; 163; 765; 3; 15; 1669371978.079540; 208.67.220.220; 7; 11505; 33250; 22157; 17547; 11505; 33250; 22157; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-17270+(42300-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.113169; 1669371978.112787; 163; 765; 3; 15; 1669371978.105480; 94.140.14.15; 7; -8827; 21150; 29785; 17547; -8827; 21150; 29785; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:18; 1669371978.153229; 1669371978.152615; 371; 814
rtt_baselines_us[156.154.71.4]=4955+(50300-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.172486; 1669371978.172003; 371; 814; 7; 16; 1669371978.163600; 156.154.71.4; 7; 2485; 25150; 22672; 17547; 2485; 25150; 22672; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6540+(40900-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.221659; 1669371978.221180; 371; 814; 7; 16; 1669371978.204600; 156.154.71.5; 7; 3042; 20450; 17180; 17547; 3042; 20450; 17180; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-1725+(43700-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.270366; 1669371978.269018; 371; 814; 7; 16; 1669371978.257550; 185.228.168.10; 7; -1020; 21850; 22712; 17547; -1020; 21850; 22712; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=13540+(53700-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.333947; 1669371978.333093; 371; 814; 7; 16; 1669371978.317620; 94.140.15.16; 7; 6862; 26850; 20080; 17547; 6862; 26850; 20080; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:18; 1669371978.352004; 1669371978.351714; 734; 58
rtt_baselines_us[156.154.70.5]=39915+(48300-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.375339; 1669371978.374824; 734; 58; 14; 1; 1669371978.362600; 156.154.70.5; 7; 19915; 24150; 4192; 17547; 19915; 24150; 4192; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=8090+(43200-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.426498; 1669371978.426108; 734; 58; 14; 1; 1669371978.407630; 156.154.71.1; 7; 3875; 21600; 17555; 17547; 3875; 21600; 17555; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.141]=-11795+(38000-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.461994; 1669371978.461521; 734; 58; 14; 1; 1669371978.452620; 94.140.14.141; 7; -6197; 19000; 24897; 17547; -6197; 19000; 24897; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=7440+(64900-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.539963; 1669371978.539333; 734; 58; 14; 1; 1669371978.529550; 9.9.9.9; 8; 4092; 32450; 28730; 17547; 4092; 32450; 28730; 17547; 8; 8; dl_low_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:18; 1669371978.552427; 1669371978.552188; 148; 578
rtt_baselines_us[208.67.220.220]=23010+(60700-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.587649; 1669371978.587168; 148; 578; 2; 11; 1669371978.575630; 208.67.220.220; 8; 11772; 30350; 18845; 17547; 11772; 30350; 18845; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-17655+(38000-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.613664; 1669371978.613036; 148; 578; 2; 11; 1669371978.603490; 94.140.14.15; 8; -9127; 19000; 27827; 17547; -9127; 19000; 27827; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.4]=4970+(43100-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.673281; 1669371978.672080; 148; 578; 2; 11; 1669371978.658610; 156.154.71.4; 8; 2312; 21550; 19065; 17547; 2312; 21550; 19065; 17547; 8; 8; dl_idle_bb; ul_low_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=6085+(47800-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.724118; 1669371978.723486; 148; 578; 2; 11; 1669371978.713460; 156.154.71.5; 8; 2987; 23900; 20857; 17547; 2987; 23900; 20857; 17547; 9; 9; dl_idle_bb; ul_low_bb; 5000; 5000
LOAD; 2022-11-25-10:26:18; 1669371978.753412; 1669371978.753121; 60; 178
rtt_baselines_us[185.228.168.10]=-2040+(43600-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.768520; 1669371978.768049; 60; 178; 1; 3; 1669371978.759430; 185.228.168.10; 8; -1180; 21800; 22820; 17547; -1180; 21800; 22820; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=13725+(51600-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.832178; 1669371978.831286; 60; 178; 1; 3; 1669371978.817500; 94.140.15.16; 8; 6902; 25800; 18937; 17547; 6902; 25800; 18937; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.70.5]=39830+(48500-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.877144; 1669371978.876763; 60; 178; 1; 3; 1669371978.864740; 156.154.70.5; 8; 19877; 24250; 4335; 17547; 19877; 24250; 4335; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7750+(48300-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.925402; 1669371978.924742; 60; 178; 1; 3; 1669371978.914600; 156.154.71.1; 8; 3832; 24150; 20275; 17547; 3832; 24150; 20275; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:18; 1669371978.954248; 1669371978.953957; 121; 45
rtt_baselines_us[94.140.14.141]=-12395+(40200-50000)/20
DATA; 2022-11-25-10:26:18; 1669371978.965518; 1669371978.963861; 121; 45; 2; 0; 1669371978.956650; 94.140.14.141; 8; -6442; 20100; 26297; 17547; -6442; 20100; 26297; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[9.9.9.9]=8185+(66000-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.045087; 1669371979.044443; 121; 45; 2; 0; 1669371979.032570; 9.9.9.9; 9; 4492; 33000; 28907; 17547; 4492; 33000; 28907; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[208.67.220.220]=23545+(65700-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.096990; 1669371979.096126; 121; 45; 2; 0; 1669371979.082610; 208.67.220.220; 9; 12165; 32850; 21077; 17547; 12165; 32850; 21077; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.14.15]=-18255+(42500-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.115455; 1669371979.115071; 121; 45; 2; 0; 1669371979.109530; 94.140.14.15; 9; -9315; 21250; 30377; 17547; -9315; 21250; 30377; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:19; 1669371979.155604; 1669371979.155224; 18; 15
rtt_baselines_us[156.154.71.4]=4625+(41500-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.168866; 1669371979.168223; 18; 15; 0; 0; 1669371979.158610; 156.154.71.4; 9; 2100; 20750; 18437; 17547; 2100; 20750; 18437; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.5]=5975+(44400-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.223302; 1669371979.222673; 18; 15; 0; 0; 1669371979.211640; 156.154.71.5; 9; 2847; 22200; 19212; 17547; 2847; 22200; 19212; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[185.228.168.10]=-2360+(43200-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.271373; 1669371979.270739; 18; 15; 0; 0; 1669371979.260580; 185.228.168.10; 9; -1350; 21600; 22780; 17547; -1350; 21600; 22780; 17547; 9; 9; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[94.140.15.16]=13805+(46100-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.330841; 1669371979.329990; 18; 15; 0; 0; 1669371979.313630; 94.140.15.16; 9; 6805; 23050; 16147; 17547; 6805; 23050; 16147; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
LOAD; 2022-11-25-10:26:19; 1669371979.355619; 1669371979.355399; 15; 15
rtt_baselines_us[156.154.70.5]=39755+(49900-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.378052; 1669371979.377580; 15; 15; 0; 0; 1669371979.367580; 156.154.70.5; 9; 19875; 24950; 5072; 17547; 19875; 24950; 5072; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000
rtt_baselines_us[156.154.71.1]=7665+(46900-50000)/20
DATA; 2022-11-25-10:26:19; 1669371979.426722; 1669371979.426242; 15; 15; 0; 0; 1669371979.414630; 156.154.71.1; 9; 3755; 23450; 19617; 17547; 3755; 23450; 19617; 17547; 8; 8; dl_idle_bb; ul_idle_bb; 5000; 5000

Ahh, is it my initialization hack to 50000:

# Read in baselines if they exist, else just set them to 1s (rapidly converges downwards on new RTTs)
    for (( reflector=0; reflector<$no_reflectors; reflector++ ))
    do
        if [[ -f /var/run/cake-autorate/reflector_${reflectors[$reflector]//./-}_baseline_us ]]; then
            read rtt_baselines_us[${reflectors[$reflector]}] < /var/run/cake-autorate/reflector_${reflectors[$reflector]//./-}_baseline_us
        else
            rtt_baselines_us[${reflectors[$reflector]}]=50000
        fi
    done
 
    # For each reflector initialize reflectory history for SMA
    for ((reflector=0; reflector<$no_reflectors; reflector++))                           
    do
        declare -n reflector_rtts_us="reflector_${reflectors[$reflector]//./_}_rtts_us"                                                                                                               
        declare -n reflector_rtts_idx="reflector_${reflectors[$reflector]//./_}_rtts_idx"                                                                                                               
        reflector_rtts_idx=0
        for ((i=0; i<$rtts_sma_period; i++)) do reflector_rtts_us[i]=50000; done
    done

But actual new samples are less than 50000:

rtt_baselines_us[94.140.14.15]=-15835+(38900-50000)/20

Perhaps I should rather instead initialize the array of past rtts to either 0 or if available the previously stored rtt_baselines_us upon a resume operation.

So the initialization then becomes:

        # Read in baselines if they exist, else just conservatively set them to 0
        for (( reflector=0; reflector<$no_reflectors; reflector++ ))
        do
                if [[ -f /var/run/cake-autorate/reflector_${reflectors[$reflector]//./-}_baseline_us ]]; then
                        read rtt_baselines_us[${reflectors[$reflector]}] < /var/run/cake-autorate/reflector_${reflectors[$reflector]//./-}_baseline_us
                else
                        rtt_baselines_us[${reflectors[$reflector]}]=0
                fi
        done

        # For each reflector initialize reflectory history for SMA
        for ((reflector=0; reflector<$no_reflectors; reflector++))
        do
                declare -n reflector_rtts_us="reflector_${reflectors[$reflector]//./_}_rtts_us"
                declare -n reflector_rtts_idx="reflector_${reflectors[$reflector]//./_}_rtts_idx"
                reflector_rtts_idx=0
                for ((i=0; i<$rtts_sma_period; i++)) do reflector_rtts_us[i]=${rtt_baselines_us[${reflectors[$reflector]}]}; done
        done

Yes I think this has fixed the issue.

Let me ask again, given that you can make our EWMA look almost identical to an SMA why the effort?
Tracking the baseline closely as you do will mis classify persistent congestion as simply part of the baseline, which IMHO counter acts the reason for autorate in the first place (keep latencies acceptably low, even if that requires to sacrifice some potential throughput).

Tracking the middle is not the right thing to do IMHO, as it will subsume part of the variable delay into the baseline estimate, which IMHO does not actually help...

Again, this has little to do with EWMA versus SMA and all with our goal for what the baseline is supposed to model. As I said it is easy to make the EWMA look close to your SMA, as it will be "easy" to make the SMA operate on minima (simply get the minimum sample in the widow first and subtract that value from all samples in the window prior to averaging), but my argument is that if we change the baseline too quickly we stop being able to detect sustained congestion.

I respectfully disagree changes in the order of ~10 seconds are unlikely to be changes in the underlaying path so they IMHO should not be modeled as changes of the baseline as that should describe the true path minimum. Think of it that way, congestion on a link can easily last for multiple minutes and with a 10 second window you will quickly in-sensitize the controller against bufferbloat.

Mind you, "bufferbloat" in a shared segment is not only caused by your link and your traffic, but also by other users (ISPs isolate user more or less from each other, but as far as I can tell more on the "less" side). As long as the user users in the cell keep hammering the basestation with requested packets the upstream congestion will continue...

Again I question the rationale behind this change :wink: and for initialization you might as well initialize with the first value or simply wait with calculating a baseline until you have a full window worth of samples collected for the SMA approach.

Which issue? Negative baseline values or the problem of accounting part of the variable delay to the supposedly static baseline :wink: ?

But the autorate cannot handle such long term congestion lasting as long, right? Isn't the point that we are looking for short term jumps associated with bufferbloat, and throttling of the cake rate to prevent that by operating under the link capacity? I have now seen on my own connection latency jump up from circa 35ms with tight spread to 80 or so with a bigger spread, and yet the available capacity seems to be in the order of 60 Mbit/s. I have no idea what causes that, but I am thinking this is not bufferbloat, and that again what we want to detect is short term latency increase, or not?

Getting the effect of the spread into the baseline seems to me like a good idea unless we actually take into account the spread when we work with only the minimum? Or put another way, it strikes me as problematic that the greater the spread the lower the baseline if we track the minimum baseline.

We could easily track both minimum (using existing EWMA code) and middle (using the new SMA) and work with that(!)?

But admittedly isn't the proof always in the pudding and the pudding is looking quite nice for me at the moment:

And I totally understand this may be more about tracking the middle rather than the minimum rather than EWMA vs SMA, but so far if we are not taking into account variance in using the minimum it seems to me like working with only the baseline middle is doing a pretty good job?

Admittedly I haven't tested in any thorough way at all here, but so far so good.

BTW @moeller0 as always I am totally open minded here, and also I need to consider your carefully thought through and insightful post above more carefully when I have more time. You understand the underlying theory a lot better than I do, and I place great store by these sorts of exchanges in helping converge on something that works well. I mean it has worked so far I think!

I think there is a way around that: periodically, for a few seconds, throttle it a bit more than necessary, so that any congestion has a chance to dissolve, and give a chance for the true baseline latency to be measured. Then unthrottle.

@patrakov do you have your connection able to test at the moment? I could share code for you to see whether it's better or worse?

Well, now, with the Chinese antennas, it is not comparable to the old results, so please share two versions of code to compare.

The commit switching from EWMA tracking minimum to SMA tracking middle is here:

I've put it in a new 'experimental' branch with revised config here:

And the 'main' branch still uses the previous technique (albeit admittedly I've tweaked some of the config parameters a little bit too, so you may want to ensure these match what you normally work with).

I'm sure the changes could be further polished a little, etc. - this is just so you can test if you like.

But so far so good from my quick and dirty testing:

Oh, it will do much better, just look at your plot how slowly the dark blue line inches up and is reset each time the current sample is smaller than the baseline, so I think we are tolerant to multiple minutes of ongoing congestion...

Well, there really only are two options, changes in the network path or lingering longer in some queue somewhere. Repetitive changes in network path are really unlikely to happen on a seconds timerange so I would say what you encounter is some form of bufferbloat, albeit one you might be willing to accept in exchange for higher throughput (sidenote, your speedtests are over the wireguard link, or could your ISP play games when recognizing speedtests?).

Well this is why we threshold the deltaDelay values and use a voting process this is designed to deal with the variable part of the delay. The baseline is modeling the hard lower limit of the network path as that is the delay we will have to accept if we want to use a reflector, no ifs not buts since the delay can not be lower. Now the variance of the deltaDelay differs between reflectors somewhat, but this variance is driven mostly by queueing/batching effects somewhere along the path. We can argue about recycling reflectors with very large deltaDelay variance, but we should not play tricks and simply hide part of that variance in the "baseline" estimate.

I get that you like your SMA implementation, but humor me and implement the EWMA with the factor i mentioned above. BUT tracking the mean and use that as baseline really just hides part of the variance into the baseline, which I do not think would be a helpful change.

Except tracking the middle is IMHO conceptually not the right split. Conceptually dissection the total delay into the unavoidable static and the variable makes more sense. And yes this has little to do with how you calculate your average estimate.

Nice idea, however the a bit more than necessary" part is the catch if we reliably would know that rate we could just set our shaper a tad below that and be done... BBR uses that approach but by the only known (to me) way to reliably probe capacity, by sending at an increased rate and measuring the effect on its flow-internal delay, but cake-autorate is opportunistic so we only have the load available that happens organically. So, I fail to see how to actually exploit this concept.

So why don't we do both? EWMA tracking minimum and SMA tracking the mid, and work from that?