Вы находитесь на странице: 1из 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 Destino Interno? N Rotamento Enfileiramento na Sada

Interface de Entrada

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 Subrede A (rate 2 Mbps) (ceil 2 Mbps)

200.1.3.0/24 Subrede B (rate 1 Mbps) (ceil 1 Mbps)

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)

> 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 qdisc root HTB

1:1

Link (3 Mbps) 200.1.3.0/24 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:31 http (rate 500 kbps) (ceil 1 Mbps) 1:32 outros (rate 500 kbps) (ceil 1 Mbps)

200.1.2.0/24 1:2 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:22 http (rate 800 kbps) (ceil 2 Mbps) 1:23 outros (rate 1 Mbps) (ceil 2 Mbps)

1:21 telnet (rate 200 kbps) (ceil 2 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

1:1

Link (3 Mbps) 200.1.3.0/24 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:31 http (rate 500 kbps) (ceil 1 Mbps) 310:0 qdisc FIFO qdisc FIFO 1:32 outros (rate 500 kbps) (ceil 1 Mbps) 320:0

200.1.2.0/24 1:2 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:22 http (rate 800 kbps) (ceil 2 Mbps) 220:0 qdisc FIFO qdisc FIFO 1:23 outros (rate 1 Mbps) (ceil 2 Mbps) 230:0

1:21 telnet (rate 200 kbps) (ceil 2 Mbps) 210: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

1:1

Link (3 Mbps) 200.1.3.0/24 1:3 Subrede B (rate 1 Mbps) (ceil 1 Mbps) 1:31 http (rate 500 kbps) (ceil 1 Mbps) 310:0 qdisc FIFO filtro prio 4 qdisc FIFO filtro prio 5 Edgard Jamhour 1:32 outros (rate 500 kbps) (ceil 1 Mbps) 320:0

200.1.2.0/24 1:2 Subrede A (rate 2 Mbps) (ceil 2 Mbps) 1:22 http (rate 800 kbps) (ceil 2 Mbps) 220:0 qdisc FIFO filtro prio 2 qdisc FIFO filtro prio 3 1:23 outros (rate 1 Mbps) (ceil 2 Mbps) 230:0

1:21 telnet (rate 200 kbps) (ceil 2 Mbps) 210:0 qdisc FIFO filtro prio 1

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 rate: e.g. 500 kbps

e.g. AF12 rate: e.g. 500 kbps

trfego total balde 1

continue
(excesso)

drop
balde 2 (excesso) burst: e.g. 62,5 kbytes

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 descarte probabilstico mximo descarte probabilstico varivel sem descarte 0 256 kbytes 32 kbytes 12 kbytes

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

Вам также может понравиться