On Mar 30, 2015, at 19:28 , Jonathan Morton <[email protected]> wrote:

> I made a lot of progress over the weekend, and got cake3 running on a 
> sacrificial box today.  No crashes yet!
> 
> The set-associative hashing is in, currently hard-coded to 8-way, which 
> should be more than adequate for typical home workloads (especially if 
> BitTorrent is marked as background).  I’m now adding statistics outputs so 
> that we can all see how well it works under real loads, distinguishing 
> between direct hits (the fast path, where the hash points directly to a 
> correctly allocated queue), indirect hits (where a search through the set 
> locates an allocated queue), misses (where an empty queue was allocated) and 
> collisions (where all the queues were already occupied by other flows).  Note 
> that “allocation” in this case simply means updating the tag on the queue to 
> match the packet, not allocating memory.  These statistics should help with 
> tuning the number of flow queues in each class.
> 
> The new Diffserv logic is also in and apparently working well.  I’m able to 
> observe both the priority-balanced and bandwidth-balanced behaviours under 
> appropriate circumstances.  It is, however, fairly sensitive to the baseline 
> quantum value from which the outer DRR weights are derived.  Setting it to 
> the MTU lets the high-priority classes burst too much, temporarily starving 
> the lower classes.  It seems to work a lot better using 256 as a baseline, 
> but I hope the overhead of going around the DRR loop several times per packet 
> isn’t too high.  It might be sane to vary the baseline quantum based on the 
> bandwidth setting, but we can experiment with that later.
> 
>> We keep track of how many bytes of system memory are consumed by a packet in 
>> 'skb->truesize'.
> 
> The buffer-occupancy queue limit is in, using the field quoted above.  
> Previously, it would just count packets.  As with previous versions of cake 
> (and fq_codel), it checks the limit immediately after enqueuing each packet, 
> and drops one packet from the head of the longest queue (by byte count) if 
> it’s violated.

        Does this mean the largest size the queue actually occupies is limit 
plus the last packet’s true size temporarily? What about the case a full MTU 
packet comes in while the eligible packet at the head of the longest queue is 
say 64 byte?

> 
> Calculating the appropriate size to use here was an interesting problem.  I 
> start by estimating the BDP (from the shaper bandwidth and the Codel 
> interval), quadrupling that and enforcing a lower limit of 64KB.  If it’s set 
> to “unlimited bandwidth”, I set the size to an arbitrary 1MB.  Then I look at 
> the packet limit, multiply that by the MTU and clamp the resulting size down 
> to that - providing a straightforward mechanism to set a limit on memory 
> usage.
> 
> This all comes with a *fifth* almost-copy of codel.h, which incorporates the 
> more efficient dequeue callback from codel4.h, but puts back the separate 
> treatment of interval and target.  Cake auto-tunes both of them to related 
> values, but the relationship isn’t as simple as scaling one from the other, 
> and I’m not comfortable with the mental contortions involved in the new 
> reasoning.

        I thought the main argument was, that interval needs to be roughly in 
the right range and target is supposed to be between 5 to 10 percent of 
interval.

> 
> I also added a lookup table for the first few inverse square roots, because I 
> found (using a spreadsheet) that these are very inaccurate if you only do one 
> Newton iteration on them - something like 1.0, 0.500, 0.563, 0.488 instead of 
> 1.0, 0.707, 0.577, 0.500.  Nebulous problems with “insufficiently tight 
> control” might possibly be traced to this.  With the first fifteen entries 
> calculated up-front using four iterations and stored, accuracy is vastly 
> improved and, in practice, almost all square-root calculations will now 
> reduce to a simple table lookup.  The memory cost is trivial, and Newton is 
> good enough for exceptionally large drop counts.
> 
> Along with the hashing statistics, I’m also adding three measures of latency 
> to replace the one from the first version.  This no longer relies on data 
> provided by Codel (so there’s no space penalty per flow for collecting it, 
> and the inner loop in the stats dump is also eliminated), but performs the 
> necessary calculation just after dequeuing each packet, storing the 
> aggregated values per class instead of per flow.  Each measure is an EWMA 
> (using optimised weights which reduce to shifts and adds), but two of them 
> are biased - one towards high latencies (so it’ll mostly track the fattest 
> flows), and one towards low latencies (so it’ll mostly track sparse flows).
> 
> Still lots of little things to do…
> 
> - Jonathan Morton

Wahoo, this sounds great. I cant’t wait to do a “test-drive” with this ;), 
(once you are looking for testers let me know)

Best Regards
        Sebastian

_______________________________________________
Codel mailing list
[email protected]
https://lists.bufferbloat.net/listinfo/codel

Reply via email to