| .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. |