Skip to content
  • Vimalkumar's avatar
    htb: improved accuracy at high rates · 56b765b7
    Vimalkumar authored
    
    
    Current HTB (and TBF) uses rate table computed by the "tc"
    userspace program, which has the following issue:
    
    The rate table has 256 entries to map packet lengths
    to token (time units).  With TSO sized packets, the
    256 entry granularity leads to loss/gain of rate,
    making the token bucket inaccurate.
    
    Thus, instead of relying on rate table, this patch
    explicitly computes the time and accounts for packet
    transmission times with nanosecond granularity.
    
    This greatly improves accuracy of HTB with a wide
    range of packet sizes.
    
    Example:
    
    tc qdisc add dev $dev root handle 1: \
            htb default 1
    
    tc class add dev $dev classid 1:1 parent 1: \
            rate 5Gbit mtu 64k
    
    Here is an example of inaccuracy:
    
    $ iperf -c host -t 10 -i 1
    
    With old htb:
    eth4:   34.76 Mb/s In  5827.98 Mb/s Out -  65836.0 p/s In  481273.0 p/s Out
    [SUM]  9.0-10.0 sec   669 MBytes  5.61 Gbits/sec
    [SUM]  0.0-10.0 sec  6.50 GBytes  5.58 Gbits/sec
    
    With new htb:
    eth4:   28.36 Mb/s In  5208.06 Mb/s Out -  53704.0 p/s In  430076.0 p/s Out
    [SUM]  9.0-10.0 sec   594 MBytes  4.98 Gbits/sec
    [SUM]  0.0-10.0 sec  5.80 GBytes  4.98 Gbits/sec
    
    The bits per second on the wire is still 5200Mb/s with new HTB
    because qdisc accounts for packet length using skb->len, which
    is smaller than total bytes on the wire if GSO is used.  But
    that is for another patch regardless of how time is accounted.
    
    Many thanks to Eric Dumazet for review and feedback.
    
    Signed-off-by: default avatarVimalkumar <j.vimal@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    56b765b7