<font face="arial" size="2"><p style="margin:0;padding:0;">Interesting conversation.   A particular switch has no idea of the "latency budget" of a particular flow - so it cannot have its *own* latency budget.   The switch designer has no choice but to assume that his latency budget is near zero.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">The number of packets that should be sustained in flight to maintain maximum throughput between the source (entry) switch and destination (exit) switch of the flow need be no higher than</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">the flow's share of bandwidth of the bottleneck</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">multiplied by</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">the end-to-end delay (including packet forwarding, but not queueing).</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">All buffering needed for isochrony ("jitter buffer") and "alternative path selection" can be moved to either before the entry switch or after the exit switch.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">If you have multiple simultaneous paths, the number of packets in flight involves replacing "bandwidth of the bottleneck" with "aggregate bandwidth across the minimum cut-set of the chosen paths used for the flow".</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">Of course, these are dynamic - "the flow's share" and "paths used for the flow" change over short time scales.  That's why you have a control loop that needs to measure them.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">The whole point of minimizing buffering is to make the measurements more timely and the control inputs more timely.  This is not about convergence to an asymptote....</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">A network where every internal buffer is driven hard toward zero makes it possible to handle multiple paths, alternate paths, etc. more *easily*.   That's partly because you allow endpoints to see what is happening to their flows more quickly so they can compensate.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">And of course for shared wireless resources, things change more quickly because of new factors - more sharing, more competition for collision-free slots, varying transmission rates, etc.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">The last thing you want is long-term standing waves caused by large buffers and very loose control.</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;"><br class="WM_COMPOSE_SIGNATURE_START" /><br class="WM_COMPOSE_SIGNATURE_END" /><br /><br />On Tuesday, May 27, 2014 11:21pm, "David Lang" <david@lang.hm> said:<br /><br /></p>
<div id="SafeStyles1401291379">
<p style="margin:0;padding:0;">> On Tue, 27 May 2014, Dave Taht wrote:<br />> <br />> > On Tue, May 27, 2014 at 4:27 PM, David Lang <david@lang.hm> wrote:<br />> >> On Tue, 27 May 2014, Dave Taht wrote:<br />> >><br />> >>> There is a phrase in this thread that is begging to bother me.<br />> >>><br />> >>> "Throughput". Everyone assumes that throughput is a big goal - and<br />> it<br />> >>> certainly is - and latency is also a big goal - and it certainly is<br />> -<br />> >>> but by specifying what you want from "throughput" as a compromise<br />> with<br />> >>> latency is not the right thing...<br />> >>><br />> >>> If what you want is actually "high speed in-order packet delivery" -<br />> >>> say, for example a movie,<br />> >>> or a video conference, youtube, or a video conference - excessive<br />> >>> latency with high throughput, really, really makes in-order packet<br />> >>> delivery at high speed tough.<br />> >><br />> >><br />> >> the key word here is "excessive", that's why I said that for max<br />> throughput<br />> >> you want to buffer as much as your latency budget will allow you to.<br />> ><br />> > Again I'm trying to make a distinction between "throughput", and "packets<br />> > delivered-in-order-to-the-user." (for-which-we-need-a-new-word-I think)<br />> ><br />> > The buffering should not be in-the-network, it can be in the application.<br />> ><br />> > Take our hypothetical video stream for example. I am 20ms RTT from netflix.<br />> > If I artificially inflate that by adding 50ms of in-network buffering,<br />> > that means a loss can<br />> > take 120ms to recover from.<br />> ><br />> > If instead, I keep a 3*RTT buffer in my application, and expect that I have<br />> 5ms<br />> > worth of network-buffering, instead, I recover from a loss in 40ms.<br />> ><br />> > (please note, it's late, I might not have got the math entirely right)<br />> <br />> but you aren't going to be tuning the retry wait time per connection. what is<br />> the retry time that is set in your stack? It's something huge to survive<br />> international connections with satellite paths (so several seconds worth). If<br />> your server-to-eyeball buffering is shorter than this, you will get a window<br />> where you aren't fully utilizing the connection.<br />> <br />> so yes, I do think that if your purpose is to get the maximum possible in-order<br />> packets delivered, you end up making different decisions than if you are just<br />> trying to stream a HD video, or do other normal things.<br />> <br />> The problem is thinking that this absolute throughput is representitive of<br />> normal use.<br />> <br />> > As physical RTTs grow shorter, the advantages of smaller buffers grow<br />> larger.<br />> ><br />> > You don't need 50ms queueing delay on a 100us path.<br />> ><br />> > Many applications buffer for seconds due to needing to be at least<br />> > 2*(actual buffering+RTT) on the path.<br />> <br />> For something like streaming video, there's nothing wrong with the application<br />> buffering aggressivly (assuming you have the space to do so on the client side),<br />> the more you have gotten transmitted to the client, the longer it can survive a<br />> disruption of it's network.<br />> <br />> There's nothing wrong with having an hour of buffered data between the server<br />> and the viewer's eyes.now, this buffering should not be in the network devices, it<br />> should be in the<br />> client app, but this isn't because there's something wrong with bufferng, it's<br />> just because the client device has so much more available space to hold stuff.<br />> <br />> David Lang<br />> <br />> >><br />> >>> You eventually lose a packet, and you have to wait a really long<br />> time<br />> >>> until a replacement arrives. Stuart and I showed that at last ietf.<br />> >>> And you get the classic "buffering" song playing....<br />> >><br />> >><br />> >> Yep, and if you buffer too much, your "lost packet" is actually still in<br />> >> flight and eating bandwidth.<br />> >><br />> >> David Lang<br />> >><br />> >><br />> >>> low latency makes recovery from a loss in an in-order stream much,<br />> much<br />> >>> faster.<br />> >>><br />> >>> Honestly, for most applications on the web, what you want is high<br />> >>> speed in-order packet delivery, not<br />> >>> "bulk throughput". There is a whole class of apps (bittorrent, file<br />> >>> transfer) that don't need that, and we<br />> >>> have protocols for those....<br />> >>><br />> >>><br />> >>><br />> >>> On Tue, May 27, 2014 at 2:19 PM, David Lang <david@lang.hm><br />> wrote:<br />> >>>><br />> >>>> the problem is that paths change, they mix traffic from streams,<br />> and in<br />> >>>> other ways the utilization of the links can change radically in a<br />> short<br />> >>>> amount of time.<br />> >>>><br />> >>>> If you try to limit things to exactly the ballistic throughput,<br />> you are<br />> >>>> not<br />> >>>> going to be able to exactly maintain this state, you are either<br />> going to<br />> >>>> overshoot (too much traffic, requiring dropping packets to<br />> maintain your<br />> >>>> minimal buffer), or you are going to undershoot (too little<br />> traffic and<br />> >>>> your<br />> >>>> connection is idle)<br />> >>>><br />> >>>> Since you can't predict all the competing traffic throughout the<br />> >>>> Internet,<br />> >>>> if you want to maximize throughput, you want to buffer as much as<br />> you can<br />> >>>> tolerate for latency reasons. For most apps, this is more than<br />> enough to<br />> >>>> cause problems for other connections.<br />> >>>><br />> >>>> David Lang<br />> >>>><br />> >>>><br />> >>>>  On Mon, 26 May 2014, David P. Reed wrote:<br />> >>>><br />> >>>>> Codel and PIE are excellent first steps... but I don't think<br />> they are<br />> >>>>> the<br />> >>>>> best eventual approach.  I want to see them deployed ASAP in<br />> CMTS' s and<br />> >>>>> server load balancing networks... it would be a disaster to<br />> not deploy<br />> >>>>> the<br />> >>>>> far better option we have today immediately at the point of<br />> most<br />> >>>>> leverage.<br />> >>>>> The best is the enemy of the good.<br />> >>>>><br />> >>>>> But, the community needs to learn once and for all that<br />> throughput and<br />> >>>>> latency do not trade off. We can in principle get far better<br />> latency<br />> >>>>> while<br />> >>>>> maintaining high throughput.... and we need to start thinking<br />> about<br />> >>>>> that.<br />> >>>>> That means that the framing of the issue as AQM is<br />> counterproductive.<br />> >>>>><br />> >>>>> On May 26, 2014, Mikael Abrahamsson <swmike@swm.pp.se><br />> wrote:<br />> >>>>>><br />> >>>>>><br />> >>>>>> On Mon, 26 May 2014, dpreed@reed.com wrote:<br />> >>>>>><br />> >>>>>>> I would look to queue minimization rather than "queue<br />> management"<br />> >>>>>><br />> >>>>>><br />> >>>>>> (which<br />> >>>>>>><br />> >>>>>>><br />> >>>>>>> implied queues are often long) as a goal, and think<br />> harder about the<br />> >>>>>>> end-to-end problem of minimizing total end-to-end<br />> queueing delay<br />> >>>>>><br />> >>>>>><br />> >>>>>> while<br />> >>>>>>><br />> >>>>>>><br />> >>>>>>> maximizing throughput.<br />> >>>>>><br />> >>>>>><br />> >>>>>><br />> >>>>>> As far as I can tell, this is exactly what CODEL and PIE<br />> tries to do.<br />> >>>>>> They<br />> >>>>>> try to find a decent tradeoff between having queues to<br />> make sure the<br />> >>>>>> pipe<br />> >>>>>> is filled, and not making these queues big enough to<br />> seriously affect<br />> >>>>>> interactive performance.<br />> >>>>>><br />> >>>>>> The latter part looks like what LEDBAT does?<br />> >>>>>> <http://tools.ietf.org/html/rfc6817><br />> >>>>>><br />> >>>>>> Or are you thinking about something else?<br />> >>>>><br />> >>>>><br />> >>>>><br />> >>>>> -- Sent from my Android device with K-@ Mail. Please excuse<br />> my brevity.<br />> >>>><br />> >>>><br />> >>>><br />> >>>> _______________________________________________<br />> >>>> Cerowrt-devel mailing list<br />> >>>> Cerowrt-devel@lists.bufferbloat.net<br />> >>>> https://lists.bufferbloat.net/listinfo/cerowrt-devel<br />> >>>><br />> >>>> _______________________________________________<br />> >>>> Cerowrt-devel mailing list<br />> >>>> Cerowrt-devel@lists.bufferbloat.net<br />> >>>> https://lists.bufferbloat.net/listinfo/cerowrt-devel<br />> >>>><br />> >>><br />> >>><br />> >>><br />> >>><br />> >><br />> ><br />> ><br />> ><br />> ><br />></p>
</div></font>