CBQ - Class Based Queueing


   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 ]


   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


   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 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  minburst  parameter


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

   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
          leafless, 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).


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


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

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

   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.

   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.

   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.

          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.

          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.

          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.

          Signifies  that  this  class  will not borrow bandwidth from its

          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
          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 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
          sluggishness  of  the  measurement  or,   conversely,   to   the
          sensitivity  of  the average to short bursts. Higher values mean
          less sensitivity.


   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 tc-cbq-details(8) for hints on how to improve this.


   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

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

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

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




   Alexey N. Kuznetsov, <>. This manpage maintained by
   bert hubert <>


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.

Free Software

Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.

Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.

Free Books

The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.

Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.

Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.