• Paolo Valente's avatar
    pkt_sched: sch_qfq: remove a source of high packet delay/jitter · c1d220fb
    Paolo Valente authored
    [ Upstream commit 87f40dd6 ]
    
    QFQ+ inherits from QFQ a design choice that may cause a high packet
    delay/jitter and a severe short-term unfairness. As QFQ, QFQ+ uses a
    special quantity, the system virtual time, to track the service
    provided by the ideal system it approximates. When a packet is
    dequeued, this quantity must be incremented by the size of the packet,
    divided by the sum of the weights of the aggregates waiting to be
    served. Tracking this sum correctly is a non-trivial task, because, to
    preserve tight service guarantees, the decrement of this sum must be
    delayed in a special way [1]: this sum can be decremented only after
    that its value would decrease also in the ideal system approximated by
    QFQ+. For efficiency, QFQ+ keeps track only of the 'instantaneous'
    weight sum, increased and decreased immediately as the weight of an
    aggregate changes, and as an aggregate is created or destroyed (which,
    in its turn, happens as a consequence of some class being
    created/destroyed/changed). However, to avoid the problems caused to
    service guarantees by these immediate decreases, QFQ+ increments the
    system virtual time using the maximum value allowed for the weight
    sum, 2^10, in place of the dynamic, instantaneous value. The
    instantaneous value of the weight sum is used only to check whether a
    request of weight increase or a class creation can be satisfied.
    
    Unfortunately, the problems caused by this choice are worse than the
    temporary degradation of the service guarantees that may occur, when a
    class is changed or destroyed, if the instantaneous value of the
    weight sum was used to update the system virtual time. In fact, the
    fraction of the link bandwidth guaranteed by QFQ+ to each aggregate is
    equal to the ratio between the weight of the aggregate and the sum of
    the weights of the competing aggregates. The packet delay guaranteed
    to the aggregate is instead inversely proportional to the guaranteed
    bandwidth. By using the maximum possible value, and not the actual
    value of the weight sum, QFQ+ provides each aggregate with the worst
    possible service guarantees, and not with service guarantees related
    to the actual set of competing aggregates. To see the consequences of
    this fact, consider the following simple example.
    
    Suppose that only the following aggregates are backlogged, i.e., that
    only the classes in the following aggregates have packets to transmit:
    one aggregate with weight 10, say A, and ten aggregates with weight 1,
    say B1, B2, ..., B10. In particular, suppose that these aggregates are
    always backlogged. Given the weight distribution, the smoothest and
    fairest service order would be:
    A B1 A B2 A B3 A B4 A B5 A B6 A B7 A B8 A B9 A B10 A B1 A B2 ...
    
    QFQ+ would provide exactly this optimal service if it used the actual
    value for the weight sum instead of the maximum possible value, i.e.,
    11 instead of 2^10. In contrast, since QFQ+ uses the latter value, it
    serves aggregates as follows (easy to prove and to reproduce
    experimentally):
    A B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 A A A A A A A A A A B1 B2 ... B10 A A ...
    
    By replacing 10 with N in the above example, and by increasing N, one
    can increase at will the maximum packet delay and the jitter
    experienced by the classes in aggregate A.
    
    This patch addresses this issue by just using the above
    'instantaneous' value of the weight sum, instead of the maximum
    possible value, when updating the system virtual time.  After the
    instantaneous weight sum is decreased, QFQ+ may deviate from the ideal
    service for a time interval in the order of the time to serve one
    maximum-size packet for each backlogged class. The worst-case extent
    of the deviation exhibited by QFQ+ during this time interval [1] is
    basically the same as of the deviation described above (but, without
    this patch, QFQ+ suffers from such a deviation all the time). Finally,
    this patch modifies the comment to the function qfq_slot_insert, to
    make it coherent with the fact that the weight sum used by QFQ+ can
    now be lower than the maximum possible value.
    
    [1] P. Valente, "Extending WF2Q+ to support a dynamic traffic mix",
    Proceedings of AAA-IDEA'05, June 2005.
    Signed-off-by: default avatarPaolo Valente <paolo.valente@unimore.it>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c1d220fb
sch_qfq.c 42.6 KB