планировщик расширенного выбора передачи (Enhanced Transmission Selection scheduler)
Имя (Name)
ETS - Enhanced Transmission Selection scheduler
Синопсис (Synopsis)
tc qdisc ... ets [ bands
number ] [ strict
number ] [ quanta
bytes bytes bytes... ] [ priomap
band band band... ]
tc class ... ets [ quantum
bytes ]
Описание (Description)
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)
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)
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)
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.
Примеры (Examples)
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)
tc(8), tc-prio(8), tc-drr(8)