| .TH CBQ 8 "16 December 2001" "iproute2" "Linux" |
| .SH NAME |
| CBQ \- Class Based Queueing |
| .SH SYNOPSIS |
| .B tc qdisc ... dev |
| dev |
| .B ( parent |
| classid |
| .B | root) [ handle |
| major: |
| .B ] cbq [ allot |
| bytes |
| .B ] avpkt |
| bytes |
| .B bandwidth |
| rate |
| .B [ cell |
| bytes |
| .B ] [ ewma |
| log |
| .B ] [ mpu |
| bytes |
| .B ] |
| |
| .B tc class ... dev |
| dev |
| .B parent |
| major:[minor] |
| .B [ classid |
| major:minor |
| .B ] cbq allot |
| bytes |
| .B [ bandwidth |
| rate |
| .B ] [ rate |
| rate |
| .B ] prio |
| priority |
| .B [ weight |
| weight |
| .B ] [ minburst |
| packets |
| .B ] [ maxburst |
| packets |
| .B ] [ ewma |
| log |
| .B ] [ cell |
| bytes |
| .B ] avpkt |
| bytes |
| .B [ mpu |
| bytes |
| .B ] [ bounded isolated ] [ split |
| handle |
| .B & defmap |
| defmap |
| .B ] [ estimator |
| interval timeconstant |
| .B ] |
| |
| .SH DESCRIPTION |
| Class Based Queueing is a classful qdisc that implements a rich |
| linksharing hierarchy of classes. It contains shaping elements as |
| well as prioritizing capabilities. Shaping is performed using link |
| idle time calculations based on the timing of dequeue events and |
| underlying link bandwidth. |
| |
| .SH SHAPING ALGORITHM |
| When shaping a 10mbit/s connection to 1mbit/s, the link will |
| be idle 90% of the time. If it isn't, it needs to be throttled so that it |
| IS idle 90% of the time. |
| |
| During operations, the effective idletime is measured using an |
| exponential weighted moving average (EWMA), which considers recent |
| packets to be exponentially more important than past ones. The Unix |
| loadaverage is calculated in the same way. |
| |
| The calculated idle time is subtracted from the EWMA measured one, |
| the resulting number is called 'avgidle'. A perfectly loaded link has |
| an avgidle of zero: packets arrive exactly at the calculated |
| interval. |
| |
| An overloaded link has a negative avgidle and if it gets too negative, |
| CBQ throttles and is then 'overlimit'. |
| |
| Conversely, an idle link might amass a huge avgidle, which would then |
| allow infinite bandwidths after a few hours of silence. To prevent |
| this, avgidle is capped at |
| .B maxidle. |
| |
| If overlimit, in theory, the CBQ could throttle itself for exactly the |
| amount of time that was calculated to pass between packets, and then |
| pass one packet, and throttle again. Due to timer resolution constraints, |
| this may not be feasible, see the |
| .B minburst |
| parameter below. |
| |
| .SH CLASSIFICATION |
| Within the one CBQ instance many classes may exist. Each of these classes |
| contains another qdisc, by default |
| .BR tc-pfifo (8). |
| |
| When enqueueing a packet, CBQ starts at the root and uses various methods to |
| determine which class should receive the data. |
| |
| In the absence of uncommon configuration options, the process is rather easy. |
| At each node we look for an instruction, and then go to the class the |
| instruction refers us to. If the class found is a barren leaf-node (without |
| children), we enqueue the packet there. If it is not yet a leaf node, we do |
| the whole thing over again starting from that node. |
| |
| The following actions are performed, in order at each node we visit, until one |
| sends us to another node, or terminates the process. |
| .TP |
| (i) |
| Consult filters attached to the class. If sent to a leafnode, we are done. |
| Otherwise, restart. |
| .TP |
| (ii) |
| Consult the defmap for the priority assigned to this packet, which depends |
| on the TOS bits. Check if the referral is leafless, otherwise restart. |
| .TP |
| (iii) |
| Ask the defmap for instructions for the 'best effort' priority. Check the |
| answer for leafness, otherwise restart. |
| .TP |
| (iv) |
| If none of the above returned with an instruction, enqueue at this node. |
| .P |
| This algorithm makes sure that a packet always ends up somewhere, even while |
| you are busy building your configuration. |
| |
| For more details, see |
| .BR tc-cbq-details(8). |
| |
| .SH LINK SHARING ALGORITHM |
| When dequeuing for sending to the network device, CBQ decides which of its |
| classes will be allowed to send. It does so with a Weighted Round Robin process |
| in which each class with packets gets a chance to send in turn. The WRR process |
| starts by asking the highest priority classes (lowest numerically - |
| highest semantically) for packets, and will continue to do so until they |
| have no more data to offer, in which case the process repeats for lower |
| priorities. |
| |
| Classes by default borrow bandwidth from their siblings. A class can be |
| prevented from doing so by declaring it 'bounded'. A class can also indicate |
| its unwillingness to lend out bandwidth by being 'isolated'. |
| |
| .SH QDISC |
| The root of a CBQ qdisc class tree has the following parameters: |
| |
| .TP |
| parent major:minor | root |
| This mandatory parameter determines the place of the CBQ instance, either at the |
| .B root |
| of an interface or within an existing class. |
| .TP |
| handle major: |
| Like all other qdiscs, the CBQ can be assigned a handle. Should consist only |
| of a major number, followed by a colon. Optional, but very useful if classes |
| will be generated within this qdisc. |
| .TP |
| allot bytes |
| This allotment is the 'chunkiness' of link sharing and is used for determining packet |
| transmission time tables. The qdisc allot differs slightly from the class allot discussed |
| below. Optional. Defaults to a reasonable value, related to avpkt. |
| .TP |
| avpkt bytes |
| The average size of a packet is needed for calculating maxidle, and is also used |
| for making sure 'allot' has a safe value. Mandatory. |
| .TP |
| bandwidth rate |
| To determine the idle time, CBQ must know the bandwidth of your underlying |
| physical interface, or parent qdisc. This is a vital parameter, more about it |
| later. Mandatory. |
| .TP |
| cell |
| The cell size determines he granularity of packet transmission time calculations. Has a sensible default. |
| .TP |
| mpu |
| A zero sized packet may still take time to transmit. This value is the lower |
| cap for packet transmission time calculations - packets smaller than this value |
| are still deemed to have this size. Defaults to zero. |
| .TP |
| ewma log |
| When CBQ needs to measure the average idle time, it does so using an |
| Exponentially Weighted Moving Average which smoothes out measurements into |
| a moving average. The EWMA LOG determines how much smoothing occurs. Lower |
| values imply greater sensitivity. Must be between 0 and 31. Defaults |
| to 5. |
| .P |
| A CBQ qdisc does not shape out of its own accord. It only needs to know certain |
| parameters about the underlying link. Actual shaping is done in classes. |
| |
| .SH CLASSES |
| Classes have a host of parameters to configure their operation. |
| |
| .TP |
| parent major:minor |
| Place of this class within the hierarchy. If attached directly to a qdisc |
| and not to another class, minor can be omitted. Mandatory. |
| .TP |
| classid major:minor |
| Like qdiscs, classes can be named. The major number must be equal to the |
| major number of the qdisc to which it belongs. Optional, but needed if this |
| class is going to have children. |
| .TP |
| weight weight |
| When dequeuing to the interface, classes are tried for traffic in a |
| round-robin fashion. Classes with a higher configured qdisc will generally |
| have more traffic to offer during each round, so it makes sense to allow |
| it to dequeue more traffic. All weights under a class are normalized, so |
| only the ratios matter. Defaults to the configured rate, unless the priority |
| of this class is maximal, in which case it is set to 1. |
| .TP |
| allot bytes |
| Allot specifies how many bytes a qdisc can dequeue |
| during each round of the process. This parameter is weighted using the |
| renormalized class weight described above. Silently capped at a minimum of |
| 3/2 avpkt. Mandatory. |
| |
| .TP |
| prio priority |
| In the round-robin process, classes with the lowest priority field are tried |
| for packets first. Mandatory. |
| |
| .TP |
| avpkt |
| See the QDISC section. |
| |
| .TP |
| rate rate |
| Maximum rate this class and all its children combined can send at. Mandatory. |
| |
| .TP |
| bandwidth rate |
| This is different from the bandwidth specified when creating a CBQ disc! Only |
| used to determine maxidle and offtime, which are only calculated when |
| specifying maxburst or minburst. Mandatory if specifying maxburst or minburst. |
| |
| .TP |
| maxburst |
| This number of packets is used to calculate maxidle so that when |
| avgidle is at maxidle, this number of average packets can be burst |
| before avgidle drops to 0. Set it higher to be more tolerant of |
| bursts. You can't set maxidle directly, only via this parameter. |
| |
| .TP |
| minburst |
| As mentioned before, CBQ needs to throttle in case of |
| overlimit. The ideal solution is to do so for exactly the calculated |
| idle time, and pass 1 packet. However, Unix kernels generally have a |
| hard time scheduling events shorter than 10ms, so it is better to |
| throttle for a longer period, and then pass minburst packets in one |
| go, and then sleep minburst times longer. |
| |
| The time to wait is called the offtime. Higher values of minburst lead |
| to more accurate shaping in the long term, but to bigger bursts at |
| millisecond timescales. Optional. |
| |
| .TP |
| minidle |
| If avgidle is below 0, we are overlimits and need to wait until |
| avgidle will be big enough to send one packet. To prevent a sudden |
| burst from shutting down the link for a prolonged period of time, |
| avgidle is reset to minidle if it gets too low. |
| |
| Minidle is specified in negative microseconds, so 10 means that |
| avgidle is capped at -10us. Optional. |
| |
| .TP |
| bounded |
| Signifies that this class will not borrow bandwidth from its siblings. |
| .TP |
| isolated |
| Means that this class will not borrow bandwidth to its siblings |
| |
| .TP |
| split major:minor & defmap bitmap[/bitmap] |
| If consulting filters attached to a class did not give a verdict, |
| CBQ can also classify based on the packet's priority. There are 16 |
| priorities available, numbered from 0 to 15. |
| |
| The defmap specifies which priorities this class wants to receive, |
| specified as a bitmap. The Least Significant Bit corresponds to priority |
| zero. The |
| .B split |
| parameter tells CBQ at which class the decision must be made, which should |
| be a (grand)parent of the class you are adding. |
| |
| As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0' |
| configures class 10:0 to send packets with priorities 6 and 7 to 10:1. |
| |
| The complimentary configuration would then |
| be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f' |
| Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1. |
| .TP |
| estimator interval timeconstant |
| CBQ can measure how much bandwidth each class is using, which tc filters |
| can use to classify packets with. In order to determine the bandwidth |
| it uses a very simple estimator that measures once every |
| .B interval |
| microseconds how much traffic has passed. This again is a EWMA, for which |
| the time constant can be specified, also in microseconds. The |
| .B time constant |
| corresponds to the sluggishness of the measurement or, conversely, to the |
| sensitivity of the average to short bursts. Higher values mean less |
| sensitivity. |
| |
| .SH BUGS |
| The actual bandwidth of the underlying link may not be known, for example |
| in the case of PPoE or PPTP connections which in fact may send over a |
| pipe, instead of over a physical device. CBQ is quite resilient to major |
| errors in the configured bandwidth, probably a the cost of coarser shaping. |
| |
| Default kernels rely on coarse timing information for making decisions. These |
| may make shaping precise in the long term, but inaccurate on second long scales. |
| |
| See |
| .BR tc-cbq-details(8) |
| for hints on how to improve this. |
| |
| .SH SOURCES |
| .TP |
| o |
| Sally Floyd and Van Jacobson, "Link-sharing and Resource |
| Management Models for Packet Networks", |
| IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995 |
| |
| .TP |
| o |
| Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995 |
| |
| .TP |
| o |
| Sally Floyd, "Notes on Class-Based Queueing: Setting |
| Parameters", 1996 |
| |
| .TP |
| o |
| Sally Floyd and Michael Speer, "Experimental Results |
| for Class-Based Queueing", 1998, not published. |
| |
| |
| |
| .SH SEE ALSO |
| .BR tc (8) |
| |
| .SH AUTHOR |
| Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by |
| bert hubert <ahu@ds9a.nl> |
| |
| |