Cake - FQ_codel the next generation
 help / color / mirror / Atom feed
From: George Amanakis <g_amanakis@yahoo.com>
To: Jonathan Morton <chromatix99@gmail.com>, cake@lists.bufferbloat.net
Subject: Re: [Cake] total download rate with many flows
Date: Mon, 13 Nov 2017 20:53:57 -0500	[thread overview]
Message-ID: <99793bbc-c7c5-43a7-f916-823dbd22f37a@yahoo.com> (raw)
In-Reply-To: <80d2c766-bde4-d46e-7b7a-0a24c8ef78c2@yahoo.com>

I meant proportionally to (1-1/sqrt(x)).


On 11/13/2017 8:51 PM, George Amanakis wrote:
> I am exploring this idea further. If q->time_next_packet is 
> incremented for dropped packets proportionally to (1-1/x), where x is 
> the count of all flows in the tin that is being served, ingress mode 
> works much more smoothly: latency is still <50ms and throughput is 
> very near to the set limit.
>
> I *tried* to make a patch from latest cobalt.
>
> =============8<=============
> diff --git a/sch_cake.c b/sch_cake.c
> index 82f264f..752783a 100644
> --- a/sch_cake.c
> +++ b/sch_cake.c
> @@ -145,6 +145,7 @@ struct cake_flow {
>         struct list_head  flowchain;
>         s32               deficit;
>         struct cobalt_vars cvars;
> +       struct cobalt_vars cvars2;
>         u16               srchost; /* index into cake_host table */
>         u16               dsthost;
>         u8                set;
> @@ -254,6 +255,7 @@ struct cake_sched_data {
>         u32             avg_window_bytes;
>         u32             avg_peak_bandwidth;
>         u64             last_reconfig_time;
> +       u32             drop_len;
>  };
>
>  enum {
> @@ -820,7 +822,7 @@ static unsigned int cake_drop(struct Qdisc *sch, 
> struct sk_buff **to_free)
>         sch->qstats.drops++;
>
>         if(q->rate_flags & CAKE_FLAG_INGRESS)
> -               cake_advance_shaper(q, b, cake_overhead(q, len), now);
> +               q->drop_len += len;
>
>  #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)
>         kfree_skb(skb);
> @@ -1274,7 +1276,9 @@ retry:
>                 /* drop this packet, get another one */
>                 if(q->rate_flags & CAKE_FLAG_INGRESS) {
>                         len = cake_overhead(q, qdisc_pkt_len(skb));
> -                       cake_advance_shaper(q, b, len, now);
> +                       flow->cvars2.count = 
> b->bulk_flow_count+b->sparse_flow_count+b->decaying_flow_count+b->unresponsive_flow_count;
> +                       cobalt_invsqrt(&(flow->cvars2));
> +                       q->drop_len += (len - reciprocal_scale(len, 
> flow->cvars2.rec_inv_sqrt));
>                         flow->deficit -= len;
>                         b->tin_deficit -= len;
>                 }
> @@ -1286,8 +1290,6 @@ retry:
>                 qdisc_qstats_drop(sch);
>                 kfree_skb(skb);
>  #endif
> -               if(q->rate_flags & CAKE_FLAG_INGRESS)
> -                       goto retry;
>         }
>
>         b->tin_ecn_mark += !!flow->cvars.ecn_marked;
> @@ -1340,7 +1342,7 @@ static void cake_advance_shaper(struct 
> cake_sched_data *q, struct cake_tin_data
>         if(q->rate_ns) {
>                 s64 tdiff1 = b->tin_time_next_packet - now;
>                 s64 tdiff2 = (len * (u64)b->tin_rate_ns) >> 
> b->tin_rate_shft;
> -               s64 tdiff3 = (len * (u64)q->rate_ns) >> q->rate_shft;
> +               s64 tdiff3 = ((q->drop_len + len) * (u64)q->rate_ns) 
> >> q->rate_shft;
>
>                 if(tdiff1 < 0)
>                         b->tin_time_next_packet += tdiff2;
> @@ -1348,6 +1350,7 @@ static void cake_advance_shaper(struct 
> cake_sched_data *q, struct cake_tin_data
>                         b->tin_time_next_packet = now + tdiff2;
>
>                 q->time_next_packet += tdiff3;
> +               q->drop_len = 0;
>         }
>  }
>
> @@ -1711,6 +1714,7 @@ static void cake_reconfigure(struct Qdisc *sch)
>  {
>         struct cake_sched_data *q = qdisc_priv(sch);
>         int c, ft;
> +       q->drop_len=0;
>
>         switch (q->tin_mode) {
>         case CAKE_MODE_BESTEFFORT:
> @@ -1941,6 +1945,7 @@ static int cake_init(struct Qdisc *sch, struct 
> nlattr *opt)
>
>                         INIT_LIST_HEAD(&flow->flowchain);
>                         cobalt_vars_init(&flow->cvars);
> +                       cobalt_vars_init(&flow->cvars2);
>
>                         q->overflow_heap[k].t = i;
>                         q->overflow_heap[k].b = j;
>
> =============8<=============
>
>
>
> On 11/11/2017 10:48 PM, George Amanakis wrote:
>> I totally understand what you are saying. However, I believe cake's 
>> egress and ingress modes currently behave as two extremes. One could 
>> argue that neither of them is the golden mean. With a patch in 
>> ingress mode (see below) and a single host using 32 flows to download 
>> I managed to increase throughput from ~7Mbps to ~10Mbps (configured 
>> limit 12200kbps) while latency increased from ~10ms to ~50ms, which 
>> would still be acceptable. As a comparison egress mode in the same 
>> setup gives me throughput ~11.5Mbps and latency ~500ms.
>>
>> I would like to hear your thoughts about this idea: the patch is 
>> incrementing q->time_next_packet for dropped packets differently than 
>> for passed-through ones. Please focus on the idea, not the actual 
>> implementation :) (also pasted in https://pastebin.com/SZ14WiYw)
>>
>> =============8<=============
>>
>> diff --git a/sch_cake.c b/sch_cake.c
>> index 82f264f..a3a4a88 100644
>> --- a/sch_cake.c
>> +++ b/sch_cake.c
>> @@ -769,6 +769,7 @@ static void cake_heapify_up(struct 
>> cake_sched_data *q, u16 i)
>>  }
>>
>>  static void cake_advance_shaper(struct cake_sched_data *q, struct 
>> cake_tin_data *b, u32 len, u64 now);
>> +static void cake_advance_shaper2(struct cake_sched_data *q, struct 
>> cake_tin_data *b, u32 len, u64 now);
>>
>>  #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)
>>  static unsigned int cake_drop(struct Qdisc *sch)
>> @@ -1274,7 +1275,7 @@ retry:
>>                 /* drop this packet, get another one */
>>                 if(q->rate_flags & CAKE_FLAG_INGRESS) {
>>                         len = cake_overhead(q, qdisc_pkt_len(skb));
>> -                       cake_advance_shaper(q, b, len, now);
>> +                       cake_advance_shaper2(q, b, len, now);
>>                         flow->deficit -= len;
>>                         b->tin_deficit -= len;
>>                 }
>> @@ -1286,8 +1287,6 @@ retry:
>>                 qdisc_qstats_drop(sch);
>>                 kfree_skb(skb);
>>  #endif
>> -               if(q->rate_flags & CAKE_FLAG_INGRESS)
>> -                       goto retry;
>>         }
>>
>>         b->tin_ecn_mark += !!flow->cvars.ecn_marked;
>> @@ -1351,6 +1350,24 @@ static void cake_advance_shaper(struct 
>> cake_sched_data *q, struct cake_tin_data
>>         }
>>  }
>>
>> +static void cake_advance_shaper2(struct cake_sched_data *q, struct 
>> cake_tin_data *b, u32 len, u64 now)
>> +{
>> +       /* charge packet bandwidth to this tin, lower tins,
>> +        * and to the global shaper.
>> +        */
>> +       if(q->rate_ns) {
>> +               s64 tdiff1 = b->tin_time_next_packet - now;
>> +               s64 tdiff2 = (len * (u64)b->tin_rate_ns) >> 
>> b->tin_rate_shft;
>> +               s64 tdiff3 = (len * (u64)q->rate_ns) >> q->rate_shft;
>> +
>> +               if(tdiff1 < 0)
>> +                       b->tin_time_next_packet += tdiff2;
>> +               else if(tdiff1 < tdiff2)
>> +                       b->tin_time_next_packet = now + tdiff2;
>> +
>> +               q->time_next_packet += (tdiff3*27)>>5;
>> +       }
>> +}
>>  static void cake_reset(struct Qdisc *sch)
>>  {
>>         u32 c;
>>
>> =============8<=============
>>
>> On 11/10/2017 4:50 PM, Jonathan Morton wrote:
>>>
>>> In fact, that's why I put a failsafe into ingress mode, so that it 
>>> would never stall completely.  It can happen, however, that 
>>> throughput is significantly reduced when the drop rate is high.
>>>
>>> If throughput is more important to you than induced latency, switch 
>>> to egress mode.
>>>
>>> Unfortunately it's not possible to guarantee both low latency and 
>>> high throughput when operating downstream of the bottleneck link.  
>>> ECN gives you better results, though.
>>>
>>> - Jonathan Morton
>>>
>>
>


  reply	other threads:[~2017-11-14  1:54 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.905.1509489461.3609.cake@lists.bufferbloat.net>
2017-11-01  0:44 ` Dave Taht
2017-11-01  1:06   ` Antoine Deschênes
2017-11-01  1:41     ` George Amanakis
2017-11-01  3:37     ` George Amanakis
     [not found]     ` <mailman.907.1509507446.3609.cake@lists.bufferbloat.net>
2017-11-01 22:01       ` Dave Taht
2017-11-10 16:32         ` George Amanakis
     [not found]         ` <mailman.964.1510331572.3609.cake@lists.bufferbloat.net>
2017-11-10 20:42           ` Dave Taht
2017-11-10 20:54             ` George Amanakis
     [not found]             ` <mailman.968.1510347301.3609.cake@lists.bufferbloat.net>
     [not found]               ` <CAJq5cE0fsOUZid7peQQYE5qwqBr9GNCx_hYE7dWs4F4UTS=RTA@mail.gmail.com>
2017-11-10 21:50                 ` Jonathan Morton
2017-11-12  3:48                   ` George Amanakis
2017-11-14  1:51                     ` George Amanakis
2017-11-14  1:53                       ` George Amanakis [this message]
     [not found]                   ` <mailman.969.1510458543.3609.cake@lists.bufferbloat.net>
2017-11-14  2:08                     ` David Lang
2017-11-14  2:49                       ` George Amanakis
     [not found]                       ` <mailman.986.1510627800.3609.cake@lists.bufferbloat.net>
2017-11-14 20:11                         ` Dave Taht
2017-11-14 22:13                           ` G. Amanakis
     [not found]                           ` <mailman.987.1510697602.3609.cake@lists.bufferbloat.net>
2017-11-14 22:23                             ` Dave Taht
2017-11-15  4:04                               ` George Amanakis
2017-11-16  4:49                                 ` Dave Taht
2017-11-16  6:52                                   ` Jonathan Morton
     [not found]                                     ` <CACvFP_jGkByNCk=-n4NOxptw59nb8Bsup4Ymd+LbGi6O_WJr5Q@mail.gmail.com>
2017-11-16 17:08                                       ` [Cake] Fwd: " Georgios Amanakis
2017-11-16 23:12                                       ` [Cake] " Jonathan Morton
     [not found] <mailman.1036.1510936271.3609.cake@lists.bufferbloat.net>
2017-11-17 20:05 ` Pete Heist
2017-11-20  8:06   ` Jonathan Morton
2017-11-20  9:07     ` Pete Heist

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.bufferbloat.net/postorius/lists/cake.lists.bufferbloat.net/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=99793bbc-c7c5-43a7-f916-823dbd22f37a@yahoo.com \
    --to=g_amanakis@yahoo.com \
    --cc=cake@lists.bufferbloat.net \
    --cc=chromatix99@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox