[Cerowrt-devel] [Bloat] fq_codel is two years old

Jonathan Morton chromatix99 at gmail.com
Thu May 15 18:53:50 EDT 2014


There is, I think, one good way to make Diffserv actually work. It does
require several steps in tandem.

Step one is to accept and admit that differential pricing based on scarcity
economics does not work on the internet. That's going to be tough to
swallow for the big commercial players.

Step two is to define service levels in such a way that asking for a bonus
in one category inherently requires taking a deficit in some other
category. This permits trusting the Diffserv field, wherever it happens to
come from.

That part is where the old TOS flags went wrong, because they tried to
define mutually exclusive characteristics of traffic orthogonally. It was
possible for traffic to request service that was simultaneously higher
bandwidth, higher reliability, lower latency, *and* cheaper than service
without any flags set. This was obviously nonsensical.

My suggested definition is a straight trade-off of priority for bandwidth.
If you want maximum bandwidth, you're going to have to put up with lower
priority relative to traffic which has effectively requested low latency,
which in turn will find itself throttled to some fraction of the available
bandwidth in return for that priority. It forces whoever is setting the
flags to make a genuine engineering trade-off, and happily it can trivially
be made compatible with the legacy Precedence interpretation of the
Diffserv field.

Codepoint 000000, naturally, corresponds to full bandwidth, minimum
priority traffic, and is the default.

To implement it, we're going to need a throttled priority queue. This
should be straightforward - a set of 64 TBFs with the special properties
that higher priority buckets refill more slowly, and that spending from a
bucket also spends the same amount from all lower-priority buckets. Then at
dequeue, take a packet from the highest priority queue with a positive
bucket and a waiting packet, then refill each bucket with the appropriate
fraction of the dequeued packet size. (Implementation detail: what to do if
no such packet exists; also, what fraction to use for each bucket.)
Naturally, each TBF can and should support a child qdisc such as fq_codel.

- Jonathan Morton
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.bufferbloat.net/pipermail/cerowrt-devel/attachments/20140516/c7cac6e6/attachment-0002.html>


More information about the Cerowrt-devel mailing list