Skip to content
  • Eric Dumazet's avatar
    fq_codel: Fair Queue Codel AQM · 4b549a2e
    Eric Dumazet authored
    
    
    Fair Queue Codel packet scheduler
    
    Principles :
    
    - Packets are classified (internal classifier or external) on flows.
    - This is a Stochastic model (as we use a hash, several flows might
                                  be hashed on same slot)
    - Each flow has a CoDel managed queue.
    - Flows are linked onto two (Round Robin) lists,
      so that new flows have priority on old ones.
    
    - For a given flow, packets are not reordered (CoDel uses a FIFO)
    - head drops only.
    - ECN capability is on by default.
    - Very low memory footprint (64 bytes per flow)
    
    tc qdisc ... fq_codel [ limit PACKETS ] [ flows number ]
                          [ target TIME ] [ interval TIME ] [ noecn ]
                          [ quantum BYTES ]
    
    defaults : 1024 flows, 10240 packets limit, quantum : device MTU
               target : 5ms (CoDel default)
               interval : 100ms (CoDel default)
    
    Impressive results on load :
    
    class htb 1:1 root leaf 10: prio 0 quantum 1514 rate 200000Kbit ceil 200000Kbit burst 1475b/8 mpu 0b overhead 0b cburst 1475b/8 mpu 0b overhead 0b level 0
     Sent 43304920109 bytes 33063109 pkt (dropped 0, overlimits 0 requeues 0)
     rate 201691Kbit 28595pps backlog 0b 312p requeues 0
     lended: 33063109 borrowed: 0 giants: 0
     tokens: -912 ctokens: -912
    
    class fq_codel 10:1735 parent 10:
     (dropped 1292, overlimits 0 requeues 0)
     backlog 15140b 10p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.1ms
    class fq_codel 10:4524 parent 10:
     (dropped 1291, overlimits 0 requeues 0)
     backlog 16654b 11p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.1ms
    class fq_codel 10:4e74 parent 10:
     (dropped 1290, overlimits 0 requeues 0)
     backlog 6056b 4p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 6.4ms dropping drop_next 92.0ms
    class fq_codel 10:628a parent 10:
     (dropped 1289, overlimits 0 requeues 0)
     backlog 7570b 5p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 5.4ms dropping drop_next 90.9ms
    class fq_codel 10:a4b3 parent 10:
     (dropped 302, overlimits 0 requeues 0)
     backlog 16654b 11p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.1ms
    class fq_codel 10:c3c2 parent 10:
     (dropped 1284, overlimits 0 requeues 0)
     backlog 13626b 9p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 5.9ms
    class fq_codel 10:d331 parent 10:
     (dropped 299, overlimits 0 requeues 0)
     backlog 15140b 10p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.0ms
    class fq_codel 10:d526 parent 10:
     (dropped 12160, overlimits 0 requeues 0)
     backlog 35870b 211p requeues 0
      deficit 1508 count 12160 lastcount 1 ldelay 15.3ms dropping drop_next 247us
    class fq_codel 10:e2c6 parent 10:
     (dropped 1288, overlimits 0 requeues 0)
     backlog 15140b 10p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.1ms
    class fq_codel 10:eab5 parent 10:
     (dropped 1285, overlimits 0 requeues 0)
     backlog 16654b 11p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 5.9ms
    class fq_codel 10:f220 parent 10:
     (dropped 1289, overlimits 0 requeues 0)
     backlog 15140b 10p requeues 0
      deficit 1514 count 1 lastcount 1 ldelay 7.1ms
    
    qdisc htb 1: root refcnt 6 r2q 10 default 1 direct_packets_stat 0 ver 3.17
     Sent 43331086547 bytes 33092812 pkt (dropped 0, overlimits 66063544 requeues 71)
     rate 201697Kbit 28602pps backlog 0b 260p requeues 71
    qdisc fq_codel 10: parent 1:1 limit 10240p flows 65536 target 5.0ms interval 100.0ms ecn
     Sent 43331086547 bytes 33092812 pkt (dropped 949359, overlimits 0 requeues 0)
     rate 201697Kbit 28602pps backlog 189352b 260p requeues 0
      maxpacket 1514 drop_overlimit 0 new_flow_count 5582 ecn_mark 125593
      new_flows_len 0 old_flows_len 11
    
    PING 172.30.42.18 (172.30.42.18) 56(84) bytes of data.
    64 bytes from 172.30.42.18: icmp_req=1 ttl=64 time=0.227 ms
    64 bytes from 172.30.42.18: icmp_req=2 ttl=64 time=0.165 ms
    64 bytes from 172.30.42.18: icmp_req=3 ttl=64 time=0.166 ms
    64 bytes from 172.30.42.18: icmp_req=4 ttl=64 time=0.151 ms
    64 bytes from 172.30.42.18: icmp_req=5 ttl=64 time=0.164 ms
    64 bytes from 172.30.42.18: icmp_req=6 ttl=64 time=0.172 ms
    64 bytes from 172.30.42.18: icmp_req=7 ttl=64 time=0.175 ms
    64 bytes from 172.30.42.18: icmp_req=8 ttl=64 time=0.183 ms
    64 bytes from 172.30.42.18: icmp_req=9 ttl=64 time=0.158 ms
    64 bytes from 172.30.42.18: icmp_req=10 ttl=64 time=0.200 ms
    
    10 packets transmitted, 10 received, 0% packet loss, time 8999ms
    rtt min/avg/max/mdev = 0.151/0.176/0.227/0.022 ms
    
    Much better than SFQ because of priority given to new flows, and fast
    path dirtying less cache lines.
    
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4b549a2e