.TH SFB 8 "August 2011" "iproute2" "Linux"
.SH NAME
sfb \- Stochastic Fair Blue
.SH SYNOPSIS
.B tc qdisc ... blue
.B rehash
milliseconds
.B db
milliseconds
.B limit
packets
.B max
packets
.B target
packets
.B increment
float
.B decrement
float
.B penalty_rate
packets per second
.B penalty_burst
packets

.SH DESCRIPTION
Stochastic Fair Blue is a classless qdisc to manage congestion based on
packet loss and link utilization history while trying to prevent
non-responsive flows (i.e. flows that do not react to congestion marking
or dropped packets) from impacting performance of responsive flows.
Unlike RED, where the marking probability has to be configured, BLUE
tries to determine the ideal marking probability automatically.

.SH ALGORITHM

The
.B BLUE
algorithm maintains a probability which is used to mark or drop packets
that are to be queued.  If the queue overflows, the mark/drop probability
is increased. If the queue becomes empty, the probability is decreased. The
.B Stochastic Fair Blue
(SFB) algorithm is designed to protect TCP flows against non-responsive flows.

This SFB implementation maintains 8 levels of 16 bins each for accounting.
Each flow is mapped into a bin of each level using a per-level hash value.

Every bin maintains a marking probability, which gets increased or decreased
based on bin occupancy.  If the number of packets exceeds the size of that
bin, the marking probability is increased.  If the number drops to zero, it
is decreased.

The marking probability is based on the minimum value of all bins a flow is
mapped into, thus, when a flow does not respond to marking or gradual packet
drops, the marking probability quickly reaches one.

In this case, the flow is rate-limited to
.B penalty_rate
packets per second.

.SH LIMITATIONS

Due to SFBs nature, it is possible for responsive flows to share all of its bins
with a non-responsive flow, causing the responsive flow to be misidentified as
being non-responsive.

The probability of a responsive flow to be misidentified is dependent on
the number of non-responsive flows, M.  It is (1 - (1 - (1 / 16.0)) ** M) **8,
so for example with 10 non-responsive flows approximately 0.2% of responsive flows
will be misidentified.

To mitigate this, SFB performs performs periodic re-hashing to avoid
misclassification for prolonged periods of time.

The default hashing method will use source and destination ip addresses and port numbers
if possible, and also supports tunneling protocols.
Alternatively, an external classifier can be configured, too.

.SH PARAMETERS
.TP
rehash
Time interval in milliseconds when queue perturbation occurs to avoid erroneously
detecting unrelated, responsive flows as being part of a non-responsive flow for
prolonged periods of time.
Defaults to 10 minutes.
.TP
db
Double buffering warmup wait time, in milliseconds.
To avoid destroying the probability history when rehashing is performed, this
implementation maintains a second set of levels/bins as described in section
4.4 of the SFB reference.
While one set is used to manage the queue, a second set is warmed up:
Whenever a flow is then determined to be non-responsive, the marking
probabilities in the second set are updated.  When the rehashing
happens, these bins will be used to manage the queue and all non-responsive
flows can be rate-limited immediately.
This value determines how much time has to pass before the 2nd set
will start to be warmed up.
Defaults to one minute, should be lower than
.B
rehash.
.TP
limit
Hard limit on the real (not average) total queue size in packets.
Further packets are dropped.  Defaults to the transmit queue length of the
device the qdisc is attached to.
.TP
max
Maximum length of a buckets queue, in packets, before packets start being
dropped.  Should be sightly larger than
.B target
, but should not be set to values exceeding 1.5 times that of
.B target .
Defaults to 25.
.TP
target
The desired average bin length.  If the bin queue length reaches this value,
the marking probability is increased by
.B increment.
The default value depends on the
.B max
setting, with max set to 25
.B target
will default to 20.
.TP
increment
A value used to increase the marking probability when the queue appears
to be over-used.  Must be between 0 and 1.0.  Defaults to 0.00050.
.TP
decrement
Value used to decrease the marking probability when the queue is found
to be empty.  Must be between 0 and 1.0.
Defaults to 0.00005.
.TP
penalty_rate
The maximum number of packets belonging to flows identified as being
non-responsive that can be enqueued per second. Once this number has been
reached, further packets of such non-responsive flows are dropped.
Set this to a reasonable fraction of your uplink throughput; the
default value of 10 packets is probably too small.
.TP
penalty_burst
The number of packets a flow is permitted to exceed the penalty rate before packets
start being dropped.
Defaults to 20 packets.

.SH STATISTICS

This qdisc exposes additional statistics via 'tc -s qdisc' output.
These are:
.TP
earlydrop
The number of packets dropped before a per-flow queue was full.
.TP
ratedrop
The number of packets dropped because of rate-limiting.
If this value is high, there are many non-reactive flows being
sent through sfb.  In such cases, it might be better to
embed sfb within a classful qdisc to better control such
flows using a different, shaping qdisc.
.TP
bucketdrop
The number of packets dropped because a per-flow queue was full.
High bucketdrop may point to a high number of aggressive, short-lived
flows.
.TP
queuedrop
The number of packets dropped due to reaching limit.  This should normally be 0.
.TP
marked
The number of packets marked with ECN.
.TP
maxqlen
The length of the current longest per-flow (virtual) queue.
.TP
maxprob
The maximum per-flow drop probability.  1 means that some
flows have been detected as non-reactive.

.SH NOTES

SFB automatically enables use of Explicit Congestion Notification (ECN).
Also, this SFB implementation does not queue packets itself.
Rather, packets are enqueued to the inner qdisc (defaults to pfifo).
Because sfb maintains virtual queue states, the inner qdisc must not
drop a packet previously queued.
Furthermore, if a buckets queue has a very high marking rate,
this implementation will start dropping packets instead of
marking them, as such a situation points to either bad congestion, or an
unresponsive flow.

.SH EXAMPLE & USAGE

To attach to interface $DEV, using default options:
.P
# tc qdisc add dev $DEV handle 1: root sfb

Only use destination ip addresses for assigning packets to bins, perturbing
hash results every 10 minutes:
.P
# tc filter add dev $DEV parent 1: handle 1 flow hash keys dst perturb 600

.SH SEE ALSO
.BR tc (8),
.BR tc-red (8),
.BR tc-sfq (8)
.SH SOURCES
.TP
o
W. Feng, D. Kandlur, D. Saha, K. Shin, BLUE: A New Class of Active Queue Management Algorithms,
U. Michigan CSE-TR-387-99, April 1999.

.SH AUTHORS

This SFB implementation was contributed by Juliusz Chroboczek and Eric Dumazet.