tc-ets(8) — Linux manual page

NAME | SYNOPSIS | DESCRIPTION | ALGORITHM | CLASSIFICATION | PARAMETERS | EXAMPLE & USAGE | SEE ALSO | AUTHOR | COLOPHON

TC(8)                             Linux                             TC(8)

NAME         top

       ETS - Enhanced Transmission Selection scheduler

SYNOPSIS         top

       tc qdisc ... ets [ bands number ] [ strict number ] [ quanta bytes
       bytes bytes...  ] [ priomap band band band...  ]

       tc class ... ets [ quantum bytes ]

DESCRIPTION         top

       The Enhanced Transmission Selection scheduler is a classful
       queuing discipline that merges functionality of PRIO and DRR
       qdiscs in one scheduler. ETS makes it easy to configure a set of
       strict and bandwidth-sharing bands to implement the transmission
       selection described in 802.1Qaz.

       On creation with 'tc qdisc add', a fixed number of bands is
       created. Each band is a class, although it is not possible to
       directly add and remove bands with 'tc class' commands. The number
       of bands to be created must instead be specified on the command
       line as the qdisc is added.

       The minor number of classid to use when referring to a band is the
       band number increased by one. Thus band 0 will have classid of
       major:1, band 1 that of major:2, etc.

       ETS bands are of two types: some number may be in strict mode, the
       remaining ones are in bandwidth-sharing mode.

ALGORITHM         top

       When dequeuing, strict bands are tried first, if there are any.
       Band 0 is tried first. If it did not deliver a packet, band 1 is
       tried next, and so on until one of the bands delivers a packet, or
       the strict bands are exhausted.

       If no packet has been dequeued from any of the strict bands, if
       there are any bandwidth-sharing bands, the dequeuing proceeds
       according to the DRR algorithm. Each bandwidth-sharing band is
       assigned a deficit counter, initialized to quantum assigned by a
       quanta element. ETS maintains an (internal) ''active'' list of
       bandwidth-sharing bands whose qdiscs are non-empty. This list is
       used for dequeuing. A packet is dequeued from the band at the head
       of the list if the packet size is smaller or equal to the deficit
       counter. If the counter is too small, it is increased by quantum
       and the scheduler moves on to the next band in the active list.

       Only qdiscs that own their queue should be added below the
       bandwidth-sharing bands. Attaching to them non-work-conserving
       qdiscs like TBF does not make sense -- other qdiscs in the active
       list will be skipped until the dequeue operation succeeds. This
       limitation does not exist with the strict bands.

CLASSIFICATION         top

       The ETS qdisc allows three ways to decide which band to enqueue a
       packet to:

       - Packet priority can be directly set to a class handle, in which
       case that
         is the queue where the packet will be put. For example, band
       number 2 of
         a qdisc with handle of 11: will have classid 11:3. To mark a
       packet for
         queuing to this band, the packet priority should be set to
       0x110003.

       - A tc filter attached to the qdisc can put the packet to a band
       by using
         the flowid keyword.

       - As a last resort, the ETS qdisc consults its priomap (see
       below), which
         maps packets to bands based on packet priority.

PARAMETERS         top

       strict The number of bands that should be created in strict mode.
              If not given, this value is 0.

       quanta Each bandwidth-sharing band needs to know its quantum,
              which is the amount of bytes a band is allowed to dequeue
              before the scheduler moves to the next bandwidth-sharing
              band. The quanta argument lists quanta for the individual
              bandwidth-sharing bands.  The minimum value of each quantum
              is 1. If quanta is not given, the default is no bandwidth-
              sharing bands, but note that when specifying a large number
              of bands, the extra ones are in bandwidth-sharing mode by
              default.

       bands  Number of bands given explicitly. This value has to be at
              least large enough to cover the strict bands specified
              through the strict keyword and bandwidth-sharing bands
              specified in quanta.  If a larger value is given, any extra
              bands are in bandwidth-sharing mode, and their quanta are
              deduced from the interface MTU. If no value is given, as
              many bands are created as necessary to cover all bands
              implied by the strict and quanta keywords.

       priomap
              The priomap maps the priority of a packet to a band. The
              argument is a list of numbers. The first number indicates
              which band the packets with priority 0 should be put to,
              the second is for priority 1, and so on.

              There can be up to 16 numbers in the list. If there are
              fewer, the default band that traffic with one of the
              unmentioned priorities goes to is the last one.

EXAMPLE & USAGE         top

       Add a qdisc with 8 bandwidth-sharing bands, using the interface
       MTU as their quanta. Since all quanta are the same, this will lead
       to equal distribution of bandwidth between the bands, each will
       get about 12.5% of the link. The low 8 priorities go to individual
       bands in a reverse 1:1 fashion (such that the highest priority
       goes to the first band).

       # tc qdisc add dev eth0 root handle 1: ets bands 8 priomap 7 6 5 4
       3 2 1 0
       # tc qdisc show dev eth0
       qdisc ets 1: root refcnt 2 bands 8 quanta 1514 1514 1514 1514 1514
       1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

       Tweak the first band of the above qdisc to give it a quantum of
       2650, which will give it about 20% of the link (and about 11.5% to
       the remaining bands):

       # tc class change dev eth0 classid 1:1 ets quantum 2650
       # tc qdisc show dev eth0
       qdisc ets 1: root refcnt 2 bands 8 quanta 2650 1514 1514 1514 1514
       1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

       Create a purely strict Qdisc with reverse 1:1 mapping between
       priorities and bands:

       # tc qdisc add dev eth0 root handle 1: ets strict 8 priomap 7 6 5
       4 3 2 1 0
       # tc qdisc sh dev eth0
       qdisc ets 1: root refcnt 2 bands 8 strict 8 priomap 7 6 5 4 3 2 1
       0 7 7 7 7 7 7 7 7

       Add a Qdisc with 6 bands, 3 strict and 3 ETS with 35%-30%-25%
       weights:

       # tc qdisc add dev eth0 root handle 1: ets strict 3 quanta 3500
       3000 2500 priomap 0 1 1 1 2 3 4 5
       # tc qdisc sh dev eth0
       qdisc ets 1: root refcnt 2 bands 6 strict 3 quanta 3500 3000 2500
       priomap 0 1 1 1 2 3 4 5 5 5 5 5 5 5 5 5

       Create a Qdisc such that traffic with priorities 2, 3 and 4 are
       strictly prioritized over other traffic, and the rest goes into
       bandwidth-sharing classes with equal weights:

       # tc qdisc add dev eth0 root handle 1: ets bands 8 strict 3
       priomap 3 4 0 1 2 5 6 7
       # tc qdisc sh dev eth0
       qdisc ets 1: root refcnt 2 bands 8 strict 3 quanta 1514 1514 1514
       1514 1514 priomap 3 4 0 1 2 5 6 7 7 7 7 7 7 7 7 7

SEE ALSO         top

       tc(8), tc-prio(8), tc-drr(8)

AUTHOR         top

       Parts of both this manual page and the code itself are taken from
       PRIO and DRR qdiscs.
       ETS qdisc itself was written by Petr Machata.

COLOPHON         top

       This page is part of the iproute2 (utilities for controlling
       TCP/IP networking and traffic) project.  Information about the
       project can be found at 
       ⟨http://www.linuxfoundation.org/collaborate/workgroups/networking/iproute2⟩.
       If you have a bug report for this manual page, send it to
       netdev@vger.kernel.org, shemminger@osdl.org.  This page was
       obtained from the project's upstream Git repository
       ⟨https://git.kernel.org/pub/scm/network/iproute2/iproute2.git⟩ on
       2025-02-02.  (At that time, the date of the most recent commit
       that was found in the repository was 2025-01-21.)  If you discover
       any rendering problems in this HTML version of the page, or you
       believe there is a better or more up-to-date source for the page,
       or you have corrections or improvements to the information in this
       COLOPHON (which is not part of the original manual page), send a
       mail to man-pages@man7.org

iproute2                      December 2019                         TC(8)

Pages that refer to this page: tc(8)