• Toke Høiland-Jørgensen's avatar
    sch_cake: Add optional ACK filter · 8b713881
    Toke Høiland-Jørgensen authored
    The ACK filter is an optional feature of CAKE which is designed to improve
    performance on links with very asymmetrical rate limits. On such links
    (which are unfortunately quite prevalent, especially for DSL and cable
    subscribers), the downstream throughput can be limited by the number of
    ACKs capable of being transmitted in the *upstream* direction.
    
    Filtering ACKs can, in general, have adverse effects on TCP performance
    because it interferes with ACK clocking (especially in slow start), and it
    reduces the flow's resiliency to ACKs being dropped further along the path.
    To alleviate these drawbacks, the ACK filter in CAKE tries its best to
    always keep enough ACKs queued to ensure forward progress in the TCP flow
    being filtered. It does this by only filtering redundant ACKs. In its
    default 'conservative' mode, the filter will always keep at least two
    redundant ACKs in the queue, while in 'aggressive' mode, it will filter
    down to a single ACK.
    
    The ACK filter works by inspecting the per-flow queue on every packet
    enqueue. Starting at the head of the queue, the filter looks for another
    eligible packet to drop (so the ACK being dropped is always closer to the
    head of the queue than the packet being enqueued). An ACK is eligible only
    if it ACKs *fewer* bytes than the new packet being enqueued, including any
    SACK options. This prevents duplicate ACKs from being filtered, to avoid
    interfering with retransmission logic. In addition, we check TCP header
    options and only drop those that are known to not interfere with sender
    state. In particular, packets with unknown option codes are never dropped.
    
    In aggressive mode, an eligible packet is always dropped, while in
    conservative mode, at least two ACKs are kept in the queue. Only pure ACKs
    (with no data segments) are considered eligible for dropping, but when an
    ACK with data segments is enqueued, this can cause another pure ACK to
    become eligible for dropping.
    
    The approach described above ensures that this ACK filter avoids most of
    the drawbacks of a naive filtering mechanism that only keeps flow state but
    does not inspect the queue. This is the rationale for including the ACK
    filter in CAKE itself rather than as separate module (as the TC filter, for
    instance).
    
    Our performance evaluation has shown that on a 30/1 Mbps link with a
    bidirectional traffic test (RRUL), turning on the ACK filter on the
    upstream link improves downstream throughput by ~20% (both modes) and
    upstream throughput by ~12% in conservative mode and ~40% in aggressive
    mode, at the cost of ~5ms of inter-flow latency due to the increased
    congestion.
    
    In *really* pathological cases, the effect can be a lot more; for instance,
    the ACK filter increases the achievable downstream throughput on a link
    with 100 Kbps in the upstream direction by an order of magnitude (from ~2.5
    Mbps to ~25 Mbps).
    
    Finally, even though we consider the ACK filter to be safer than most, we
    do not recommend turning it on everywhere: on more symmetrical link
    bandwidths the effect is negligible at best.
    
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarToke Høiland-Jørgensen <toke@toke.dk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8b713881
sch_cake.c 61 KB