Escolar Documentos
Profissional Documentos
Cultura Documentos
Qo SLinux
Qo SLinux
tc Traffic Control
Edgard Jamhour
Edgard Jamhour
Interface de
Entrada
Destino
Interno?
N
Rotamento
Enfileiramento
na Sada
Interface de
Sada
Edgard Jamhour
Qdisc principal
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.
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
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.
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.
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.
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.
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)
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.
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
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
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.
DSCP em Hexa
DS em Hexa
Edgard Jamhour
Policiamento: Policing
Controle do
excesso de
trfego e
marcao para
classe de core
Roteador de
borda
Roteador de
core
Policiamento: Policing
ENVIADO PARA CLASSE
NORMAL
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
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).
256 kbytes
descarte probabilstico
mximo
32 kbytes
descarte probabilstico
varivel
12 kbytes
sem descarte
0
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