| .TH TC 8 "24 January 2012" "iproute2" "Linux" |
| .SH NAME |
| sfq \- Stochastic Fairness Queueing |
| .SH SYNOPSIS |
| .B tc qdisc ... |
| .B [ divisor |
| hashtablesize |
| .B ] [ limit |
| packets |
| .B ] [ perturb |
| seconds |
| .B ] [ quantum |
| bytes |
| .B ] [ flows |
| number |
| .B ] [ depth |
| number |
| .B ] [ headdrop |
| .B ] [ redflowlimit |
| bytes |
| .B ] [ min |
| bytes |
| .B ] [ max |
| bytes |
| .B ] [ avpkt |
| bytes |
| .B ] [ burst |
| packets |
| .B ] [ probability |
| P |
| .B ] [ ecn |
| .B ] [ harddrop ] |
| .SH DESCRIPTION |
| |
| Stochastic Fairness Queueing is a classless queueing discipline available for |
| traffic control with the |
| .BR tc (8) |
| command. |
| |
| SFQ does not shape traffic but only schedules the transmission of packets, based on 'flows'. |
| The goal is to ensure fairness so that each flow is able to send data in turn, thus preventing |
| any single flow from drowning out the rest. |
| |
| This may in fact have some effect in mitigating a Denial of Service attempt. |
| |
| SFQ is work-conserving and therefore always delivers a packet if it has one available. |
| .SH ALGORITHM |
| On enqueueing, each packet is assigned to a hash bucket, based on the packets hash value. |
| This hash value is either obtained from an external flow classifier (use |
| .B |
| tc filter |
| to set them), or a default internal classifier if no external classifier has been configured. |
| |
| When the internal classifier is used, sfq uses |
| .TP |
| (i) |
| Source address |
| .TP |
| (ii) |
| Destination address |
| .TP |
| (iii) |
| Source and Destination port |
| .P |
| If these are available. SFQ knows about ipv4 and ipv6 and also UDP, TCP and ESP. |
| Packets with other protocols are hashed based on the 32bits representation of their |
| destination and source. A flow corresponds mostly to a TCP/IP connection. |
| |
| Each of these buckets should represent a unique flow. Because multiple flows may |
| get hashed to the same bucket, sfqs internal hashing algorithm may be perturbed at configurable |
| intervals so that the unfairness lasts only for a short while. Perturbation may |
| however cause some inadvertent packet reordering to occur. After linux-3.3, there is |
| no packet reordering problem, but possible packet drops if rehashing hits one limit |
| (number of flows or packets per flow) |
| |
| When dequeuing, each hashbucket with data is queried in a round robin fashion. |
| |
| Before linux-3.3, the compile time maximum length of the SFQ is 128 packets, which can be spread over |
| at most 128 buckets of 1024 available. In case of overflow, tail-drop is performed |
| on the fullest bucket, thus maintaining fairness. |
| |
| After linux-3.3, maximum length of SFQ is 65535 packets, and divisor limit is 65536. |
| In case of overflow, tail-drop is performed on the fullest bucket, unless headdrop was requested. |
| |
| .SH PARAMETERS |
| .TP |
| divisor |
| Can be used to set a different hash table size, available from kernel 2.6.39 onwards. |
| The specified divisor must be a power of two and cannot be larger than 65536. |
| Default value: 1024. |
| .TP |
| limit |
| Upper limit of the SFQ. Can be used to reduce the default length of 127 packets. |
| After linux-3.3, it can be raised. |
| .TP |
| depth |
| Limit of packets per flow (after linux-3.3). Default to 127 and can be lowered. |
| .TP |
| perturb |
| Interval in seconds for queue algorithm perturbation. Defaults to 0, which means that |
| no perturbation occurs. Do not set too low for each perturbation may cause some packet |
| reordering or losses. Advised value: 60 |
| This value has no effect when external flow classification is used. |
| Its better to increase divisor value to lower risk of hash collisions. |
| .TP |
| quantum |
| Amount of bytes a flow is allowed to dequeue during a round of the round robin process. |
| Defaults to the MTU of the interface which is also the advised value and the minimum value. |
| .TP |
| flows |
| After linux-3.3, it is possible to change the default limit of flows. |
| Default value is 127 |
| .TP |
| headdrop |
| Default SFQ behavior is to perform tail-drop of packets from a flow. |
| You can ask a headdrop instead, as this is known to provide a better feedback for TCP flows. |
| .TP |
| redflowlimit |
| Configure the optional RED module on top of each SFQ flow. |
| Random Early Detection principle is to perform packet marks or drops in a probabilistic way. |
| (man tc-red for details about RED) |
| .nf |
| redflowlimit configures the hard limit on the real (not average) queue size per SFQ flow in bytes. |
| .fi |
| .TP |
| min |
| Average queue size at which marking becomes a possibility. Defaults to |
| .B max |
| /3 |
| .TP |
| max |
| At this average queue size, the marking probability is maximal. Defaults to |
| .B redflowlimit |
| /4 |
| .TP |
| probability |
| Maximum probability for marking, specified as a floating point number from 0.0 to 1.0. Default value is 0.02 |
| .TP |
| avpkt |
| Specified in bytes. Used with burst to determine the time constant for average queue size calculations. Default value is 1000 |
| .TP |
| burst |
| Used for determining how fast the average queue size is influenced by the real queue size. |
| .nf |
| Default value is : |
| .B (2 * min + max) / (3 * avpkt) |
| .fi |
| .TP |
| ecn |
| RED can either 'mark' or 'drop'. Explicit Congestion |
| Notification allows RED to notify remote hosts that their rate exceeds the |
| amount of bandwidth available. Non-ECN capable hosts can only be notified by |
| dropping a packet. If this parameter is specified, packets which indicate |
| that their hosts honor ECN will only be marked and not dropped, unless the |
| queue size hits |
| .B depth |
| packets. |
| .TP |
| harddrop |
| If average flow queue size is above |
| .B max |
| bytes, this parameter forces a drop instead of ecn marking. |
| .SH EXAMPLE & USAGE |
| |
| To attach to device ppp0: |
| .P |
| # tc qdisc add dev ppp0 root sfq |
| .P |
| Please note that SFQ, like all non-shaping (work-conserving) qdiscs, is only useful |
| if it owns the queue. |
| This is the case when the link speed equals the actually available bandwidth. This holds |
| for regular phone modems, ISDN connections and direct non-switched ethernet links. |
| .P |
| Most often, cable modems and DSL devices do not fall into this category. The same holds |
| for when connected to a switch and trying to send data to a congested segment also |
| connected to the switch. |
| .P |
| In this case, the effective queue does not reside within Linux and is therefore not |
| available for scheduling. |
| .P |
| Embed SFQ in a classful qdisc to make sure it owns the queue. |
| |
| It is possible to use external classifiers with sfq, for example to hash traffic based only |
| on source/destination ip addresses: |
| .P |
| # tc filter add ... flow hash keys src,dst perturb 30 divisor 1024 |
| .P |
| Note that the given divisor should match the one used by sfq. If you have |
| changed the sfq default of 1024, use the same value for the flow hash filter, too. |
| |
| .P |
| Example of sfq with optional RED mode : |
| .P |
| # tc qdisc add dev eth0 parent 1:1 handle 10: sfq limit 3000 flows 512 divisor 16384 |
| redflowlimit 100000 min 8000 max 60000 probability 0.20 ecn headdrop |
| |
| .SH SOURCE |
| .TP |
| o |
| Paul E. McKenney "Stochastic Fairness Queuing", |
| IEEE INFOCOMM'90 Proceedings, San Francisco, 1990. |
| |
| .TP |
| o |
| Paul E. McKenney "Stochastic Fairness Queuing", |
| "Interworking: Research and Experience", v.2, 1991, p.113-131. |
| |
| .TP |
| o |
| See also: |
| M. Shreedhar and George Varghese "Efficient Fair |
| Queuing using Deficit Round Robin", Proc. SIGCOMM 95. |
| |
| .SH SEE ALSO |
| .BR tc (8), |
| .BR tc-red (8) |
| |
| .SH AUTHORS |
| Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, |
| Eric Dumazet <eric.dumazet@gmail.com>. |
| .P |
| This manpage maintained by bert hubert <ahu@ds9a.nl> |
| |
| |