dwww Home | Manual pages | Find package

CBQ(8)                               Linux                              CBQ(8)

NAME
       CBQ - Class Based Queueing

SYNOPSIS
       tc  qdisc  ... dev dev ( parent classid | root) [ handle major: ] cbq [
       allot bytes ] avpkt bytes bandwidth rate [ cell bytes ] [ ewma log ]  [
       mpu bytes ]

       tc  class  ... dev dev parent major:[minor] [ classid major:minor ] cbq
       allot bytes [ bandwidth rate ] [ rate rate ]  prio  priority  [  weight
       weight  ] [ minburst packets ] [ maxburst packets ] [ ewma log ] [ cell
       bytes ] avpkt bytes [ mpu bytes ] [ bounded isolated ] [ split handle &
       defmap defmap ] [ estimator interval timeconstant ]

DESCRIPTION
       Class Based Queueing is a classful qdisc that implements a  rich  link-
       sharing  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.

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 exponen-
       tial 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 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  con-
       straints, this may not be feasible, see the minburst parameter below.

CLASSIFICATION
       Within  the  one  CBQ  instance  many  classes may exist. Each of these
       classes contains another qdisc, by default tc-pfifo(8).

       When enqueueing a packet, CBQ starts at the root and uses various meth-
       ods 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.

       (i)    Consult filters attached to the class. If sent to a leafnode, we
              are done.  Otherwise, restart.

       (ii)   Consult the defmap for the priority  assigned  to  this  packet,
              which  depends  on  the TOS bits. Check if the referral is leaf-
              less, otherwise restart.

       (iii)  Ask the defmap for instructions for the 'best effort'  priority.
              Check the answer for leafness, otherwise restart.

       (iv)   If  none  of  the above returned with an instruction, enqueue at
              this node.

       This algorithm makes sure that a packet always ends up somewhere,  even
       while you are busy building your configuration.

       For more details, see tc-cbq-details(8).

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  con-
       tinue 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 in-
       dicate its unwillingness to lend out bandwidth by being 'isolated'.

QDISC
       The root of a CBQ qdisc class tree has the following parameters:

       parent major:minor | root
              This  mandatory  parameter  determines  the place of the CBQ in-
              stance, either at the root of an interface or within an existing
              class.

       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.

       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.

       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.

       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.

       cell   The  cell  size determines he granularity of packet transmission
              time calculations. Has a sensible default.

       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.

       ewma log
              When  CBQ needs to measure the average idle time, it does so us-
              ing an Exponentially Weighted Moving Average which  smooths  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.

       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.

CLASSES
       Classes have a host of parameters to configure their operation.

       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.

       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.  Op-
              tional, but needed if this class is going to have children.

       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.  De-
              faults to the configured rate, unless the priority of this class
              is maximal, in which case it is set to 1.

       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.

       prio priority
              In the round-robin process, classes  with  the  lowest  priority
              field are tried for packets first. Mandatory.

       avpkt  See the QDISC section.

       rate rate
              Maximum  rate  this class and all its children combined can send
              at. Mandatory.

       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.

       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 toler-
              ant of bursts. You can't set maxidle directly, only via this pa-
              rameter.

       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  min-
              burst  lead  to  more  accurate shaping in the long term, but to
              bigger bursts at millisecond timescales. Optional.

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

       bounded
              Signifies  that  this  class  will not borrow bandwidth from its
              siblings.

       isolated
              Means that this class will not borrow bandwidth to its siblings

       split major:minor & defmap bitmap[/bitmap]
              If consulting filters attached to a class did not  give  a  ver-
              dict,  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  re-
              ceive,  specified  as a bitmap. The Least Significant Bit corre-
              sponds to priority zero. The 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.

       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 interval microseconds how much traffic  has  passed.  This
              again  is  a EWMA, for which the time constant can be specified,
              also in microseconds. The time constant corresponds to the slug-
              gishness of the measurement or, conversely, to  the  sensitivity
              of  the  average to short bursts. Higher values mean less sensi-
              tivity.

BUGS
       The actual bandwidth of the underlying link may not be known, for exam-
       ple 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 sec-
       ond long scales.

       See tc-cbq-details(8) for hints on how to improve this.

SOURCES
       o      Sally Floyd and Van Jacobson, "Link-sharing and Resource Manage-
              ment Models for Packet Networks", IEEE/ACM Transactions on  Net-
              working, Vol.3, No.4, 1995

       o      Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995

       o      Sally  Floyd,  "Notes  on  Class-Based Queueing: Setting Parame-
              ters", 1996

       o      Sally Floyd and Michael Speer, "Experimental Results for  Class-
              Based Queueing", 1998, not published.

SEE ALSO
       tc(8)

AUTHOR
       Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
       bert hubert <ahu@ds9a.nl>

iproute2                       16 December 2001                         CBQ(8)

Generated by dwww version 1.16 on Tue Dec 16 15:16:30 CET 2025.