Você está na página 1de 23

Mecanismos de QoS em Linux

tc Traffic Control
Edgard Jamhour

Edgard Jamhour

Este mdulo descreve os principais mecanismos de QoS disponveis no kernel do Linux.


Para utilizar esses mecanismos, necessrio criar uma poltica coerente de QoS, que
determina como os pacotes recebidos sero classificados, tratados e encaminhados pelo
S.O.
A configurao de QoS no linux baseada no utilitrio de comando de linha denominado tc
(traffic control).
Existem algumas outras tentativas de construir outras interfaces de administrao do QoS
do Linux, mas a maioria delas usa o prprio tc para gerar as configuraes de QoS. Por
isso, esse mdulo ir se focar apenas no uso do tc.

Algumas das figuras utilizadas nessa apostila foram extradas do tutorial:


http://www.opalsoft.net/qos/DS.htm

Controle de Trfego (TC)


Camadas Superiores
(TCP, UDP)
S
Elementos do TC
Policiamento

Interface de
Entrada

Destino
Interno?

N
Rotamento

Enfileiramento
na Sada

Interface de
Sada

Edgard Jamhour

O Linux possui implementado em seu kernel um conjunto de algoritmos para controle de


trfego, genericamente denominados como TC (Traffic Control). Esses algoritmos permitem
modificar a forma como os pacotes recebidos pelo sistema operacional so encaminhados
pela rede.
Basicamente, o controle de trfego implementado atravs de dois mecanismos:
1) Pacotes so policiados na entrada. Atravs do policiamento, pacotes indesejveis so
descartados.
2) Pacotes so enfileirados na respectiva interface de sada. Os pacotes armazenados nas
filas podem ser atrasados, marcados, descartados ou priorizados
As polticas de QoS do Linux so criadas de forma independente para cada interface do
equipamento. Em qualquer caso, deve-se sempre levar em conta que o policiamento feito
para pacotes encaminhados para uma data interface e, o controle de trfego propriamente
dito, para os pacotes que so enviados pela interface.
Por exemplo, em um roteador, cada interface controla o QoS do trfego em um nico
sentido. Se um roteador possui uma interface para a LAN interna e outra WAN para
Internet, ento as polticas de QoS na interface LAN controlam o que transmitido para
Internet (upload) e na interface WAN o que recebido (download).
Para ter acesso as funes de controle de trfego, o Linux disponibiliza um utilitrio de
comando de linha denominado tc. O tc permite criar uma poltica de QoS, que define a
seqncia de algoritmos que so aplicados para tratamento do trfego. A poltica de QoS
definida cascateando-se elementos lgicos que representam por quais etapas os pacotes
sero encaminhados, antes de serem entregues a interface de sada.

Poltica de QoS e Elementos do TC


Qdisc da classe

Qdisc principal

Edgard Jamhour

Os elementos definidos pelo tc so os seguintes:


a) Queuing Disciplines = qdisc
algoritmos que controlam o enfileiramento e envio de pacotes.
b) Classes
representam entidades de classificao de pacotes.
c) Filters
utilizados para policiar e classificar os pacotes e atribu-los as classes.
d) Policers
utilizados para evitar que o trfego associado a cada filtro ultrapasse limites
pr-definidos.
A figura ilustra uma estrutura tpica para controle de trfego.
Observe que as qdiscs so usadas em duas situaes: a qdisc principal e as qdiscs
associadas as classes. A qdisc principal obrigatria. ela quem define a estratgia geral
de QoS implementada pelo tc e, em especial, de qual das classes o pacote ser escolhido
para envio. A funo das qdiscs de classes definir quais pacotes da classe esto prontos
para serem transmitidos.
A quantidade de classes varivel e depende da quantidade de tratamentos diferenciados
que sero implementados pelo tc. Por exemplo, se a poltica de QoS quer apenas
diferenciar o tratamento de trfego de VoIP e dados, bastariam apenas duas classes.
Contudo, se a poltica quiser criar tratamentos diferenciados para os dados, mais classes
precisaro ser criadas.
Os filtros so os classificadores. Sua funo encaminhar os pacotes para sua respectiva
classe (por exemplo, pacotes de dados para uma classe e pacotes de VoIP para outra).

Comandos tc: Criar a qdisc principal


> tc qdisc add dev eth0
root handle 1:0
htb
> tc class add dev eth0
parent 1:0 classid 1:1
htb rate 500Kbit
> tc class add dev eth0
parent 1:0 classid 1:2
htb rate 300Kbit
Edgard Jamhour

A configurao da poltica de QoS feita atravs de um script formado por uma seqncia
de comandos tc. Cada comando tc responsvel por criar um dos elementos da poltica de
controle de trfego desejada.
O primeiro comando da figura cria a qdisc principal (root) associada a interface eth0.
importante observar que as polticas de controle de trfego so especficas para cada uma
das interfaces disponveis no equipamento. Todas as qdiscs precisam ser identificadas por
um nmero denominado handle. O identificador da qdisc tem sempre o formato N:0, onde N
um nmero inteiro qualquer. Todas as qdiscs so definidas por um tipo de algoritmo que
define como o controle de trfego efetuado. No exemplo, htb (hierachical token bucket) o
algoritmo utilizado pela qdisc. O funcionamento do htb ser discutido na seqncia deste
mdulo.
O segundo conjunto de comandos da figura cria duas classes com taxas diferentes.
Observe que as classes so filhas da qdisc principal (conforme observado pelo atributo
parent), e so do mesmo tipo htb. As classes do tipo htb exigem um parmetro que define a
taxa com que os pacotes armazenados em cada classe sero transmitidos. As classes so
identificadas por um cdigo classid. Esse cdigo precisa seguir o seguinte formato
especfico: (handle do elemento pai):(cdigo da classe). No exemplo, as classes so
nomeadas como 1:1 e 1:2 porque elas so filhas da qdisc de handle 1:0. O nmero depois
dos : pode ser qualquer, no precisando ser definidos em ordem. Contudo, no podem
haver elementos de poltica com classid ou handle repetidos.

Comandos: Criar as qdisc das classes


> tc qdisc add dev eth0 parent 1:1 handle 10:0
pfifo limit 10
> tc qdisc add dev eth0 parent 1:2 handle 20:0
pfifo limit 10
> tc filter add dev eth0 parent 1:0
protocol ip u32 match ip protocol 0x06 0xff
flowid 1:1
> tc filter add dev eth0 parent 1:0
protocol ip u32 match ip protocol 0x11 0xff
flowid 1:2
Edgard Jamhour

O primeiro conjunto de comandos na figura cria as qdiscs associadas a cada classe.


Observe que cada qdisc filha das classe a ela associada (conforme indicado pelo
parmetro parent). Novamente, as qdisc precisam ser identificadas por um handle que
segue o formato N:0. As qdiscs de classe determinam em que ordem os pacotes j
armazenados na fila sero removidos. Nesse caso, as qdiscs implementam uma simples
poltica do tipo FIFO (First-In First-Out), criando um buffer com capacidade mxima de 10
pacotes.
O segundo conjunto de comandos cria os filtros. O tc permite utilizar dois tipos de filtros: o
u32 e o iptables. Apesar de ser mais familiar, o uso do iptables junto com tc menos
recomendado, pois necessrio criar regras identificadas por ndices com o iptables, e
aportar esses ndices usando o tc. Os filtros u32, por outro lado, podem ser definidos
diretamente no comando tc. Os filtros u32 so definidos da seguinte forma:
protocol ip u32: indica que o filtro do tipo u32 ser utilizado. Esses parmetros so
repetidos em todos os comandos tc que usam o filtro u32, independente da regra criada.
match ip <valor campo> <mscara>: indica qual o critrio utilizado para classificar um
pacote.
Geralmente, a regra definida em termos dos campos do cabealho ip (ip de origem, ip de
destino, tipo de protocolo, tos, dscp, etc) ou tcp/udp (porta de origem, porta de destino). No
exemplo, o critrio baseado unicamente no campo protocol (tipo de protocolo) do
cabealho IP. O cdigo 0x06 corresponde ao TCP e o cdigo 0x11 ao cdigo UDP
(conforme norma do IANA). O classificador u32 utiliza mscaras para todos os cdigos dos
campos, de forma similar ao que feito com endereos IP. A mscara usada da seguinte
forma:
Se <campo do pacote> E-BINRIO <mscara> = <valor do campo> ento o pacote
classificado pela regra, e encaminhado para o cdigo da classe definido pelo flowid. Caso
contrrio, a prxima regra testada.

Seqncia de filtros u32


Pacotes HTTP recebidos por 192.168.0.1/24 vo para classe
1:1. Os demais pacotes TCP recebidos por esse host vo
para classe 1:2
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32
match ip protocol 0x06 0xff
match ip sport 80 0xfff
match ip dst 192.168.0.1/24
flowid 1:1
tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32
match ip protocol 0x06 0xff
match ip dst 192.168.0.1/24
flowid 1:2
Edgard Jamhour

Os filtros u32 so analisados em seqncia, de forma semelhante as regras de um firewall.


Geralmente, uma poltica de QoS pode definir filtros sobrepostos, como os da seguinte
poltica:
"Pacotes HTTP recebidos por 192.168.0.1/24 vo para classe 1:1. Os demais pacotes TCP
recebidos por esse host vo para classe 1:2".
Observe que todos os pacotes enviados a classe 1:1 so na verdade um subconjunto dos
pacotes enviados a classe 1:2. Se o roteador testar se um pacote pertence a classe 1:2
primeiro, nenhum pacote ser enviado a classe 1.1.
Para evitar que isso acontea necessrio colocar os filtros em ordem, listando os filtros
mais especficos antes dos mais genricos.
Isso feito utilizando o atributo prio disponvel para os filtros u32. Os filtros de prio menor
so testados sempre antes dos maiores. Se dois filtros tem o mesmo prio, provavelmente o
ltimo filtro a ser criado ser testado primeiro. Contudo, melhor nunca confiar nessa
premissa, e utilizar o valor de prio para garantir uma ordem correta de interpretao dos
filtros.

Verificando as regras com o tc


tc [-s] qdisc/class/filter show dev eth0
mosta as qdisc/class/filter associadas a interface
s mostra as estatsticas do uso da qdisc/class/filter

tc qdisc del root dev eth0


limpa as regras de QoS

iplink show
mostra a classe default associada a interface
Edgard Jamhour

As polticas criadas pelo tc ficam em memria at que o computador seja reiniciado, pois os
comandos tc so acumulativos. Isto , quando um novo elemento criado, os anteriores
no so eliminados. possvel listar todos os elementos tc em memria atravs dos
seguintes comandos:
tc [-s] qdisc show dev eth0: Mostra todas as qdiscs associadas a interface eth0. Se o
atributo opcional [-s] for utilizado, as estatsticas associadas as qdiscs so mostradas. As
estatsticas so muito dependentes do tipo de qdisc criada, mas geralmente contm a
quantidade de pacotes que foi processada por cada qdisc.
tc [-s] class show dev eth0: Mostra todas as classes associadas a interface eth0. Se o
atributo opcional [-s] for utilizado, as estatsticas associadas as classes so mostradas.
Assim com as qdiscs, as estatsticas so muito dependentes do tipo de classe criada, e
descrevem a quantidade de pacotes processada por cada classe.
tc [-s] class filter dev eth0: Mostra todas os filtros e policiadores associados a interface eth0.
Se o atributo opcional [-s] for utilizado, as estatsticas associadas aos filtros so tambm
mostradas. As estatsticas descrevem a quantidade de pacotes que foi classificada por cada
filtro.
Geralmente melhor criar um script com todos os comandos tc ao invs de digit-los
diretamente via console. Como os comandos so acumulativos, necessrio apagar todos
os elementos da poltica antes de executar os script novamente. O seguinte comando deve
ser includo no incio do script para garantir que apenas a poltica do script ser utilizada
pelo sistema operacional:
tc qdisc del root dev eth0
Normalmente, o Linux utiliza uma poltica do tipo FIFO default associada a cada interface.
Essa poltica sobreposta, sem necessidade de apag-la, quando se cria uma nova classe
root. Em alguns sistemas o comando iplink show permite ver a classe default associada a
interface. O iplink, contudo, raramente instalado pelas distribuies do Linux.

Queueing Disciplines

FIFO: First In First Out


SFQ: Stochastic Fair Queuing
TBF: Token Bucket Flow
DS_MARK: Diff-Serv Marker
RED: Random Early Detection
PRIO: Priority Queue
[CBQ: Class-Based Queueing] = OBSOLETA
HTB: Hierarquical Token Bucket

Edgard Jamhour

O efeito de uma poltica de QoS determinada pelo tipo da queuing discipline (qdisc).
Conforme dissemos, algumas qdiscs so utilizadas para controlar o escalonamento de
mltiplas classes e outras para controlar a sada de trfego de uma nica classe.
As seguintes qdiscs so usadas para controlar o escalonamento de uma nica classe:
FIFO (First In First Out): implementa a poltica First-In First-Out, que indica que os pacotes
sero servidos na mesma ordem que chegaram.
SFQ (Stochastic Fair Queuing): procura equilibrar a quantidade de banda disponvel para
cada fluxo em uma fila.
TBF (Token Bucket Flow): permite controlar a taxa com que os pacotes de uma fila so
servidos.
DS_MARK (Diff-Serv Marker): efetua a marcao dos campos DSCP dos pacotes para
implementar a metodologia Diffserv.
RED (Random Early Detection): algoritmo de descarte preventivo para diminuir o tamanho
da fila e, consequentemente, o atraso mdio experimentado pelos pacotes
As seguintes qdiscs so usadas para controlar o escalonamento de mltiplas classes filhas:
PRIO (Priority Queue): coordena a ordem em que as filas so servidas segundo um
esquema de prioridade (injusto).
CBQ: (Class-Based Queueing): coordena a ordem em que as filas so servidas segundo um
esquema hierrquico.
HTB: (Hierarquical Token Bucket): coordena a ordem em que as filas so servidas segundo
um esquema hierrquico. Substituto do CBQ
Todas as qdiscs acima est definidas para o kernel do Linux sem adio de patches, mas
cada uma delas pode ser desabilitadas individualmente durante compilao do kernel.

FIFO: First In First Out

> tc qdisc add dev eth0 root handle 1:0


pfifo limit 10
> tc qdisc add dev eth0 parent 1:1 handle 10:0
pfifo limit 10
Edgard Jamhour

A figura ilustra o princpio do algoritmo FIFO. A qdisc do tipo FIFO implementa um


procedimento de encaminhamento em que os pacotes so servidos na mesma ordem em
que chegam a interface do roteador ou a uma classe, independente do fluxo ao qual eles
pertencem. Na abordagem FIFO, se forem misturados pacotes TCP e UDP em uma mesma
fila, possvel que os pacotes UDP dominem o uso da banda, pois no existe forma de
equilibrar a quantidade de banda alocada a cada fluxo.
As qdisc FIFO podem ser criadas como root (default) ou associadas as classes. O uso da
FIFO como root a implementao default da poltica QoS do Linux. A figura ilustra a
criao da qdisc para as duas situaes: o primeiro comando cria a classe como root e o
segundo comando cria a qdisc FIFO como uma classe filha. Observe que essa qdisc solicita
apenas um parmetro, denominado limit, que determina a quantidade mxima de pacotes
que podem aguardar na fila antes que sejam descartados.

PRIO: Priorizao Injusta

> tc qdisc add dev eth0 root handle 1:0


prio
Edgard Jamhour

O qdisc do tipo PRIO controla o escalonamento de mltiplas classes filhas, sendo usada,
usualmente, apenas como classe root. Essa qdisc cria automaticamente trs classes: alta
prioridade, mdia prioridade e baixa prioridade. O escalonamento implementado pela PRIO
uma priorizao injusta, isto , a classe de alta prioridade servida enquanto tiver
pacotes. A classe de mdia prioridade servida apenas quando a classe de alta prioridade
estiver vazia. A classe de baixa prioridade servida apenas quando ambas as classes
superiores esto vazias. Esse tipo de escalonamento dito injusto pois pode fazer com que
as classes menos prioritrias jamais sejam servidas.
A parte inferior da figura mostra como a qdisc criada. Observe que a PRIO no solicita
nenhum parmetro. O comando cria uma poltica completa, j com as trs classes e um
qdisc fifo associada a cada classe, mas no cria os filtros. As classes so nomeadas de
acordo com o cdigo handle da qdisc. Por exemplo, se a qdisc PRIO tiver o cdigo 1:0, a
classe de alta prioridade ser 1:1, a classe de mdia prioridade 1:2 e a classe de baixa
prioridade 1:3. Para completar a poltica o administrador do sistema deve criar os filtros
indicando quais polticas so alocadas para cada uma das classes.

TBF: Token Bucket Function

> tc qdisc add dev eth0 root handle 1:0


prio
> tc qdisc add dev eth0 parent 1:1
tbf rate 0.5mbit burst 5k latency 70ms
peakrate 1mbit minburst 1500
Edgard Jamhour

A qdisc do tipo TBF (Token Bucket Function) usada para controlar a banda de uma nica
classe. Por exemplo, suponha que a qdisc principal seja do tipo PRIO, gerando as classes
1:1 (alta prioridade), 1:2 (mdia prioridade) e 1:3 (baixa prioridade). Como vimos, o
escalonamento PRIO injusto, pois as classes 1:2 e 1:3 podem nunca ser servidas, caso
hajam muitos pacotes associados a classe 1:1.
Esse problema pode ser evitado, se uma qdisc TBF limitar a banda da classe 1:1. A
seqncia de comandos para implementar essa poltica ilustrada na figura. Observe que o
primeiro comando cria as trs classes e tambm as qdiscs do tipo FIFO associadas a cada
classe (de forma automtica). O segundo comando substitui a qdisc FIFO associada a
classe 1:1 por outra do tipo TBF.
Os parmetros usados pelo TBF so os seguintes:
rate: taxa mdia atribuda a classe
burst: tamanho do balde (em bytes), para controlar a durao das rajadas
latency: tempo mximo que um pacote pode ficar na fila aguardando uma ficha
peakrate: taxa de pico mxima das rajadas (em kbps ou mpbs)
minburst: quantidade mnimas de bytes contabilizada por pacote. Geralmente, utiliza-se o
MTU de um quadro Ethernet (1500 bytes). Mesmo que um pacote com tenha tamanho
inferior ao minburst, a quantidade de fichas consumidas do balde contabilizar o valor de
minburst. Esse mecanismo usado para evitar que um fluxo de pacotes pequenos seja
tratado da mesma forma que poucos pacotes grandes. O primeiro caso consome mais
recursos do roteador, e por isso penalizado.

SFQ: Stochastic Fair Queuing

> tc qdisc add dev eth0 root handle 1:0


sfq perturb 10
> tc qdisc add dev eth0 parent 1:1 handle 10:0
sfq perturb 10
Edgard Jamhour

O algoritmo SFQ (Stochastic Fair Queuing) controla a forma como os pacotes de uma
classe ou interface so encaminhados. Esse tipo de algoritmo cria automaticamente
mltiplas filas para distribuir o fluxo de pacotes. Um fluxo de pacotes determinado pela
tupla (ip_origem:porta_origem ip_destino:porta_destino). As filas SFQ so servidas um
pacote de cada vez, utilizando a estratgia de round-robin, de maneira que a quantidade de
banda atribuda a cada fila equilibrada. A quantidade de filas SFQ nessa abordagem
varivel, pois depende da quantidade de fluxos que atravessa uma interface ou uma classe
do rotedor.
Esse algoritmo controlado por dois parmetros:
perturb: que determina o intervalo para reclculo do algoritmo de hashing, que readapta as
filas para uma nova quantidade de fluxos. O valor recomendado para esse parmetro 10s.
quantum: determina a quantidade de pacotes removidos da fila SFQ por interao. O valor
default 1 = maximum sized packet (MTU-sized), o que determina que um pacote enviado
por completo de cada fila, cada vez que ela servida.

HTB: Hierarquical Token Bucket


Link
(3 Mbps)

200.1.2.0/24

200.1.3.0/24

Subrede A
(rate 2 Mbps) (ceil 2 Mbps)

telnet
(rate 200 kbps)
(ceil 2 Mbps)

http
(rate 800 kbps)
(ceil 2 Mbps)

outros
(rate 1 Mbps)
(ceil 2 Mbps)

Subrede B
(rate 1 Mbps) (ceil 1 Mbps)

http
(rate 500 kbps)
(ceil 1 Mbps)

outros
(rate 500 kbps)
(ceil 1 Mbps)

> tc qdisc add dev eth0 root handle 1: htb


> tc class add dev eth0 parent 1:0 classid 1:1
htb rate rate ceil rate burst bytes
[ cburst bytes ] [ prio priority ]
Edgard Jamhour

O algoritmo HTB permite estruturar uma hierarquia de diviso de bandas pela concatenao
de classes. O HTB considerado substituto do CBQ (Class Base Queuing), cuja
implementao ineficiente no considerada mais recomendada. Para criar uma poltica
HTB, a classe root precisa ser do tipo htb, conforme indicado no primeiro comando da
figura. Em seguida, cria-se um conjunto de classes usando o segundo comando. As classes
possuem um conjunto de parmetros utilizados para controlar a taxa de transmisso do
trfego que ela representa.
Os parmetros da classe so os seguintes:
rate: taxa mdia garantida para classe e suas filhas
ceil: taxa mxima que pode ser emprestada da classe pai
burst: quantidade mxima de bytes que pode ser enviada na taxa ceil
cburst: quantidade mxima de bytes que pode ser enviada na taxa da interface (quando
no houver limite imposto pela classe pai)
priority: ordenamento das classes. As classes de maior prioridade recebem o excesso de
banda primeiro, reduzindo sua latncia (prio 0 a maior)
Para ilustrar como o HTB utilizado considere o exemplo da figura. A poltica determina que
um enlace de 3 Mbps deve ser dividido entre duas redes: A e B. A rede A recebeu 2 Mbps
de banda garantida, e no pode ultrapassar esse limite, mesmo que haja banda disponvel
no enlace (pois rate igual a ceil). A rede B possui 1 Mbps de banda garantida, e tambm
no pode ultrapassar esse limite.
A banda da subrede A dividida em aplicaes de telnet, http e outras. As aplicaes de
telnet tem 200kbps garantidos, mas podem usar toda a banda da subrede caso as outras
classes no estejam usando (pois o ceil igual a capacidade total da subrede). O mesmo
raciocnio se aplica para http e outros tipos de trfego. Observe que o limite das classes
filhas no pode ultrapassar o rate da classe pai.

HTB: Criao da Classes


1:0

1:1

qdisc
root HTB

Link
(3 Mbps)

200.1.2.0/24
1:2

200.1.3.0/24

Subrede A
(rate 2 Mbps) (ceil 2 Mbps)

1:3

Subrede B
(rate 1 Mbps) (ceil 1 Mbps)

1:21

1:22

1:23

1:31

1:32

telnet
(rate 200 kbps)
(ceil 2 Mbps)

http
(rate 800 kbps)
(ceil 2 Mbps)

outros
(rate 1 Mbps)
(ceil 2 Mbps)

http
(rate 500 kbps)
(ceil 1 Mbps)

outros
(rate 500 kbps)
(ceil 1 Mbps)

Edgard Jamhour

A fim de criar a hierarquia de classes, necessrio escolher os identificadores de cada


classe que compe a poltica. Como todas as classes so filhas da qdisc principal
(identificada no exemplo pelo handle 1:0), todas as classes seguem a numerao 1:X. Um
cuidado especial deve ser feito para indicar o relacionamento entre classes pais e filhas.
O script que ilustra a criao das classes para a poltica do desenho pode ser definido da
seguinte forma:
#!/bin/bash
tc qdisc del dev eth0 root
# cria a qdisc principal
tc qdisc add dev eth0 handle 1:0 root htb
# cria as classes para o link
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 3000 kbit
# cria as classes para as subredes
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 2000 kbit ceil 2000 kbit
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1000 kbit ceil 1000 kbit
# cria as classes para dividir o trfego da subrede A
tc class add dev eth0 parent 1:2 classid 1:21 htb rate 200 kbit ceil 2000 kbit
tc class add dev eth0 parent 1:2 classid 1:22 htb rate 800 kbit ceil 2000 kbit
tc class add dev eth0 parent 1:2 classid 1:23 htb rate 1000 kbit ceil 2000 kbit
# cria as classes para dividir o trfego da subrede B
tc class add dev eth0 parent 1:3 classid 1:31 htb rate 500 kbit ceil 1000 kbit
tc class add dev eth0 parent 1:3 classid 1:32 htb rate 500 kbit ceil 1000 kbit

HTB: Qdisc das Classes


1:0

qdisc
root HTB

Link
(3 Mbps)

1:1

200.1.2.0/24

200.1.3.0/24

Subrede A
(rate 2 Mbps) (ceil 2 Mbps)

1:2

1:3

Subrede B
(rate 1 Mbps) (ceil 1 Mbps)

1:21

1:22

1:23

1:31

1:32

telnet
(rate 200 kbps)
(ceil 2 Mbps)

http
(rate 800 kbps)
(ceil 2 Mbps)

outros
(rate 1 Mbps)
(ceil 2 Mbps)

http
(rate 500 kbps)
(ceil 1 Mbps)

outros
(rate 500 kbps)
(ceil 1 Mbps)

210:0
qdisc
FIFO

220:0
qdisc
FIFO

230:0
qdisc
FIFO

310:0
qdisc
FIFO

320:0
qdisc
FIFO

Edgard Jamhour

Para completar a poltica necessrio incluir as qdisc para cada uma das classes folhas.
Observe que apenas as classes folha (as mais inferiores na hierarquia) pode ser associadas
as qdiscs. Associar uma qdisc a uma classe no folha, significa remover o pacote da fila
antes que ele seja completamente classificado.
No exemplo todas as qdiscs das classes so do tipo FIFO. O script a seguir ilustra esse
conceito.
# cria as qdiscs FIFO associada as classes folhas
tc qdisc add dev eth0 parent 1:21 handle 210:0 pfifo limit 10
tc qdisc add dev eth0 parent 1:22 handle 220:0 pfifo limit 10
tc qdisc add dev eth0 parent 1:23 handle 230:0 pfifo limit 10
tc qdisc add dev eth0 parent 1:31 handle 310:0 pfifo limit 10
tc qdisc add dev eth0 parent 1:32 handle 320:0 pfifo limit 10

HTB: Filtros
1:0

qdisc
root HTB

Link
(3 Mbps)

1:1

200.1.2.0/24

200.1.3.0/24

Subrede A
(rate 2 Mbps) (ceil 2 Mbps)

1:2

1:3

Subrede B
(rate 1 Mbps) (ceil 1 Mbps)

1:21

1:22

1:23

1:31

1:32

telnet
(rate 200 kbps)
(ceil 2 Mbps)

http
(rate 800 kbps)
(ceil 2 Mbps)

outros
(rate 1 Mbps)
(ceil 2 Mbps)

http
(rate 500 kbps)
(ceil 1 Mbps)

outros
(rate 500 kbps)
(ceil 1 Mbps)

210:0
qdisc
FIFO
filtro
prio 1

220:0
qdisc
FIFO
filtro
prio 2

230:0

310:0

qdisc
FIFO

qdisc
FIFO

filtro
prio 3

filtro
prio 4

320:0
qdisc
FIFO
filtro
prio 5
Edgard Jamhour

Alm das qdiscs necessrio definir os filtros que classificam os pacotes para cada classe.
Novamente, so definidos filtros apenas para as classes folhas, que acumulam todas as
regras de classificao das classes pai. Por exemplo, o filtro para classe de telnet da
subrede A possui dois conjuntos de condies "match", uma para descriminar a subrede e
outro para dizer caracterizar o trfego de telnet.
Os filtros para o trfego default (indicado como outros na figura), so implementados
criando-se regra genricas (sempre satisfeitas), mas de prioridade mais baixa. Por exemplo,
na subrede A, pacotes que no se classificarem nas regras de prioridade 1 (telnet) ou 2
(htth), so classificados necessariamente na classe 3 (pois ela no tem restrio de porta).
O script a seguir ilustra esse conceito.
# Cria os filtros para as classes folhas
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 \
match ip src 200.1.2.0/24 match ip dport 23 0xfff flowid 1:21
tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 \
match ip src 200.1.2.0/24 match ip dport 80 0xfff flowid 1:22
tc filter add dev eth0 parent 1:0 protocol ip prio 3 u32 \
match ip src 200.1.2.0/24 flowid 1:23
tc filter add dev eth0 parent 1:0 protocol ip prio 4 u32 \
match ip src 200.1.3.0/24 match ip dport 80 0xfff flowid 1:31
tc filter add dev eth0 parent 1:0 protocol ip prio 5 u32 \
match ip src 200.1.3.0/24 flowid 1:32

DSMARK: Marcao do Byte DS


new_DS = (old_DS & mask) | value

> tc qdisc add dev eth0 root handle 1:0


dsmark indices n default_index id
> tc class change dev eth0 classid 1:id
dsmark mask mask value value
Edgard Jamhour

A qdisc DSMARK utilizada para fazer a marcao ou remarcao do byte DS. Para criar
uma poltica de marcao, necessrio criar uma qdisc root do tipo dsmark, conforme
indicado no primeiro comando da figura. A qdisc dsmark definida por dois parmetros:
indices e default_index. O parmetro indices corresponde ao nmero de marcaes
distintas que sero feitas. Por exemplo, se indices=4, ento podero ser feitas at 4
marcaes de pacotes com diferentes valores de DS (6 bits DSCP + 2bits ECN). O valor de
indices deve ser mltiplo de 4, de forma que se forem necessrios marcar 7 cdigos
distintos, ser necessrio utilizar ndices=8.
A qdisc DSMARK cria automaticamente uma classe para receber os pacotes de cada um
dos diferentes valores de DS que sero marcados. As classes so criadas de acordo com o
handle da qdisc root, usando os cdigos N:1, N:2, etc., onde N:0 cdigo da qdsic root.
Essas classes no possuem marcao associada. Para definir como a marcao ser feita,
necessrio executar um comando "tc class change" para cada uma das classes de
marcao da poltica, conforme indicado pelo segundo comando da figura. O comando "tc
class change" definido por dois parmetro: mask e value.
O byte DS do pacote marcado efetuando-se duas operaes: um AND com o valor de
mask e depois um OR com o valor de value, ou seja:
new_DS = (old_DS & mask) | value
Esse mtodo bastante flexvel pois permite tanto efetuar a marcao com a remarcao
do byte DS. Observe que para atribuir um valor ao byte DS de forma independente do seu
contedo anterior, basta utilizar o valor 0x00 como mask.

Byte DS X DSCP para PHBs padronizados


Drop Precedence

DSCP em Hexa

DS em Hexa

Edgard Jamhour

A classes DSMARK alteram o valor do byte DS e no do campo DSCP. Convm recordar


que o byte DS composto por dois campos: 6 bits do cdigo DSCP e 2 bits de notificao
explcita de congestionamento (ECN). Atualmente, os bits ECN ainda so pouco usados, de
forma que o uso principal do DSMARK a marcao do campo DSCP. Como a DSMARK
usa um valor em hexadecimal para os oito bits do byte DS, preciso fazer uma
manipulao de bits (um shift left de dois bits) para determinar qual o valor do DS
corresponde a um dado cdigo de DSCP.
A tabela na figura ilustra quais os valores devem ser usados no campo DS para obter cada
um dos cdigos DSCP correspondentes aos PHB's padronizados do Diffserv. A seguir so
listados alguns exemplos de como definir os valores de mask e value para as classes
DSMARK:
a) Setar todos os pacotes para AF23 independente do valor original:
mask 0x0 (b00000000 ) value 0x58 (b01011000 )
b) Setar todos os pacotes como AF12, preservando os bits ECN:
mask 0x3 (b00000011 ) value 0x30 (b00110000 )
c) Setar em 2 o 'drop precedence' de todos os pacotes
mask 0xe3 (b11100011 ) value 0x10 (b00010000)
d) Setar todos os pacotes para AF3, sem alterar os bites ECN e os bits de precedncia.
mask 0x1f (b00011111) value 0x60 (b01100000)

Policiamento: Policing
Controle do
excesso de
trfego e
marcao para
classe de core

Trfego garantido: AF11


Trfego excedente: AF12
Trfego violado: DROP

Roteador de
borda

Roteador de
core

> tc filter ....


police rate kbit burst BYTES
[reclassify | drop | continue]
Edgard Jamhour

Normalmente, as polticas do tipo DSMARK so utilizadas juntamente com polticas de


policiamento. A razo para isso que os pacotes pertencentes ao PHB AF (Assured
Forwarded) no so classificados apenas de acordo com o tipo de trfego, mas tambm de
acordo com a quantidade de pacotes recebidos na classe. Por exemplo, alguns pacotes do
trfego de dados de um usurio podem ser marcados como AF11, AF12 ou descartados j
na entrada do roteador, dependo se ele excedeu ou no a quantidade de trfego garantida
no seu contrato de SLA.
As polticas de policiamento so implementadas juntamente com os filtros incluindo-se a
palavra reservada police no comandos tc filter, conforme indicado na figura. O
policiamento implementado de acordo com um filtro token bucket definido por uma taxa
mdia (parmetro rate, em kbps) e um tamanho de balde (burst, em kbytes). O ltimo
parmetro especifica o que deve ser feito com os pacotes que excederem o burst. Trs
aes so possveis:
drop: os pacotes so descartados
continue: procura-se uma outra regra para classificar o excesso de trfego.
classify (apenas para CBQ): classifica o pacote como Best Effort.

Policiamento: Policing
ENVIADO PARA CLASSE
NORMAL

ENVIADO PARA CLASSE DE


TRATAMENTO DE EXCESSO

e.g. AF11

e.g. AF12

rate:
e.g. 500 kbps

trfego
total

rate:
e.g. 500 kbps

continue
balde 1
burst:
e.g. 62,5 kbytes

(excesso)

drop
balde 2

(excesso)

X
drop

burst:
e.g. 62,5 kbytes

Edgard Jamhour

Uma poltica de marcao com mltiplas cores (por exemplo, AF11, AF12 e drop)
implementada cascateando-se filtros que tem o mesmo critrio de classificao (isto , os
mesmos valores para os campos do cabealho IP ou TCP/UDP), mas com valores e aes
de policiamento distintas. Por exemplo, a figura define a seguinte poltica: pacotes enviados
pelo usurio at a taxa de 500 kbps so marcados como AF11, pacotes entre 500 kbps e
1000 kbps so marcados como AF12 e pacotes acima de 1 Mbps so descartados.
Suponha que essa poltica se aplica a qualquer pacote enviado pelo usurio 192.168.1.2/32.
O script que implementa essa poltica definido a seguir:
#!/bin/bash
tc qdisc del dev eth0 root
# Crias as classes dsmark
tc qdisc add dev eth0 handle 1:0 root dsmark indices 4
# Marcao em AF11
tc class change dev eth0 parent 1:0 classid 1:1 dsmark mask 0x0 value 0x28
# Marcao AF12
tc class change dev eth0 parent 1:0 classid 1:2 dsmark mask 0x0 value 0x30
# Filtro para classe AF11
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 \
match ip dst 192.168.1.2/32
police rate 500kbit burst 62,5k continue classid 1:1
# Filtro para classe AF12
tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32
match ip dst 192.168.1.2/32
police rate 500kbit burst 62,5 k drop classid 1:2

RED: Random Early Detection

> tc qdisc add dev eth0 root handle 1:0 \


red limit <bytes> min <bytes> max <bytes> avpkt <bytes> \
burst <packets> probability <number> bandwidth <kbps> [ecn]
> tc qdisc add dev eth0 parent 1:1 handle 10:0 red ...
Edgard Jamhour

O principal objetivo deste algoritmo limitar o tamanho das filas, controlando o atraso mdio
introduzido na transmisso de pacotes. Esse tipo de qdisc pode ser usado tanto em classes
root (primeiro comando do exemplo), quanto para classes individuais (segundo comando do
exemplo). Os parmetros que controlam o comportamento dessa qdisc so os seguintes:
probability: probabilidade de descarte (de 0.0 a 1.0). Recomendado: 0.01 ou 0.02. Entre
min e max, a probabilidade de descarte proporcional ao tamanho mdio da fila
max: tamanho mdio da fila com probabilidade de descarte mxima. Esse valor
determinado pela frmula: (largura de banda do enlace) * (atraso mximo desejado)
min: tamanho de fila mdio que inicia o descarte. Valor recomendado: 1/3 * max
limit: tamanho mximo instantneo da fila. Valor recomendado: >> max + burst ou 8 * max
burst: tolerncia para tamanho instantneo da fila. Valor recomendado:
(min+min+max)/(3*avpkt).
avpkt: Tamanho mdio do pacote em bytes
ecn: Explicit Congestion Notification. Corresponde ao bits menos significativos do byte DS.
Quando ECN usado, os pacotes abaixo de limit so marcados com ECN ao invs de
descartados.
bandwidth: usado para calcular o tamanho mdio da fila na ausncia de trfego
(velocidade do link).

RED: Random Early Detection


descarte total para fila
instantnea

256 kbytes

descarte probabilstico
mximo

32 kbytes

descarte probabilstico
varivel

12 kbytes

sem descarte
0

> tc qdisc add dev eth0 root handle 1:0 \


red limit 256000 min 12000 max 32000 avpkt 1000 \
burst 20 probability 0.02 bandwidth 512 ecn
Edgard Jamhour

Para ilustrar como os parmetros do algoritmo de RED so calculados, considere a seguinte


poltica associada a interface de um roteador com capacidade de 512 kbps. Deseja-se que
os pacote sejam servidos com um atraso mdio inferior a 0.5 s. O tamanho mdio dos
pacotes 1 Kbyte.
Para calcular os parmetros do RED, adota-se o seguinte procedimento:
a) Clculo da capacidade do enlace em bytes/sec
<bandwidth> = 512 kbps ~ 512000 bps = 64000 bytes / sec
b) Clculo do tamanho mximo da fila em bytes
Latncia mxima desejada = 500 ms. Ento:
<max> = 64000 bytes / sec * 0.5 sec = 32000 bytes
c) Tamanho da fila onde o descarte iniciado:
<min> = ~ 1/3 <max> = 12000 bytes
d) Tamanho mximo instantneo da fila
<limit> = ~ 8 * <max> = 256000 bytes.
e) Tamanho mdio dos pacotes:
<avpkt> = 1000 bytes.
f) Tolerncia para o tamanho instantneo da fila em pacotes
<burst> = (2 * <min> + <max>) / (3 * <avpkt>)
= (2 * 12000 + 32000) / (3 * 1000) = 18.67 ~ 20.

Concluso
O tc do linux apresenta um conjunto de algoritmos para controlar
a forma como o trfego transmitido.
As polticas de QoS so feitas de forma independente para cada
interface do computador/roteador
Os algoritmos de enfileiramento afetam apenas os pacotes que
saem pela interface, e no os que entram.
Em um roteador, cada interface controla o QoS do trfego em
um nico sentido.

Edgard Jamhour

Nesse mdulo ns vimos o conjunto de mecanismos de QoS disponveis no kernel do linux.


Esses mecanismos so configurados atravs de polticas atravs do comando tc.
Existem um conjunto amplo de mecanismos disponveis para QoS. Contudo, muitos desses
mecanismos so usados em situaes diferentes. Cabe ao administrador de rede selecionar
o conjunto de mecanismos mais adequado para a poltica de QoS que deseja implementar.
Um cuidado especial deve ser tomado com o sentido do trfego que se deseja controlar. As
polticas de QoS so feitas de forma independente para cada interface do
computador/roteador e afetam apenas os pacotes que saem pela interface, e no os que
entram.
Se as polticas forem aplicadas a um servidor, por exemplo, elas iro afetar o download para
o servidor e no o upload. A razo para isso que no se pode controlar diretamente a
quantidade de pacotes que chega apenas no seu destino, preciso control-la na origem.
Por exemplo, em um roteador, cada interface controla o QoS do trfego em um nico
sentido. Se um roteador possui uma interface para a LAN interna e outra WAN para
Internet, ento as polticas de QoS na interface LAN controlam o que transmitido para
Internet (upload) e na interface WAN o que recebido (download).

Você também pode gostar