A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Administração de Largura de Banda no Linux II

Dom

22

Abr

2007


18:09

(7 votos, média 4.14 de 5) 


Nível avançado No artigo Administração de Largura de Banda no Linux foram vistas filas e disciplinas. Também foram citadas as filas simples de disciplina sem classe. Este texto complementa o primeiro falando sobre as filas de disciplina com classe.

Filas de Disciplina com classe

Qdiscs com classe são muito úteis quando há tipos diferentes de tráfego que devem receber tratamento diferenciado. Uma das qdiscs com classe é conhecida como 'CBQ' (Class Based Queueing) e é citada com tanta frequência que as pessoas associam filas com classe apenas com a CBQ, o que não está correto.

A CBQ é apenas a mais antiga delas e também a mais complexa. Como velha ranzinza, ela nem sempre faz o que você quer. Isto pode chocar muita gente que já passou pelo 'efeito sendmail', o qual nos ensina que qualquer tecnologia complexa que é fornecida sem documentação precisa ser a melhor que existe.

Falaremos sobre a CBQ e suas alternativas logo a seguir.

O fluxo nas qdiscs com classe

Quando o tráfego entra numa qdisc com classe, ele precisa ser enviado para uma das classes da qdisc, ou seja, ele precisa ser 'classificado'. Para determinar o que deve ser feito com um pacote, os assim chamados 'filtros' são consultados. É importante saber que os filtros são chamados de dentro da qdisc!

Os filtros associados a esta qdisc retornam uma decisão que a qdisc utiliza para colocar o pacote na fila de uma das classes. Cada subclasse pode usar filtros adicionais para ver se mais alguma instrução é aplicável. Se não, a classe coloca o pacote na fila da sua qdisc.

Além de conter outras qdiscs, a maioria das qdisc com classe fazem modelagem. Isto é útil para estabelecer horários (com SFQ, por exemplo) e controlar taxas. Você vai precisar disto se tiver uma interface de alta velocidade (por exemplo, uma Ethernet) ligada a um dispositivo mais lento (um cable modem). Se você rodar apenas a SFQ, nada vai mudar porque os pacotes entram e saem do seu roteador sem retardo: a interface de saída é muita mais rápida do que a velocidade do link e não haverá fila para gerenciar.

A família qdisc: raízes, manipuladores, irmãos e pais

Cada interface possui uma 'qdisc raiz' (root qdisc) de egressão (saída). Por default, esta é a fila de disciplina sem classe pfifo_fast. Cada qdisc e cada classe recebe um manipulador (handle), o qual pode ser usado por declarações de configuração para referir esta qdisc. Além de uma qdisc de egressão, uma interface também pode ter uma qdisc de ingresso que policia o tráfego de entrada.

Os manipuladores destas qdiscs têm duas partes, um número principal (ou maior) e um secundário (ou menor) no formato :. Costuma-se chamar a qdisc raiz de '1:', o que é o mesmo que '1:0'. O número menor de uma qdisc é sempre 0.

As classes precisam ter o mesmo número principal que seus pais. Este número precisa ser único num setup de ingresso ou de egressão. O número menor precisa ser único dentro de uma qdisc e suas classes.

Como os filtros são usados para classificar o tráfego

Uma hierarquia típica pode ter o seguinte aspecto:


                     1:   qdisc raiz
                      |
                     1:1    classe filha
                   /  |  \
                  /   |   \
                 /    |    \
                 /    |    \
              1:10  1:11  1:12   classes filhas
               |      |     | 
               |     11:    |    classe folha
               |            | 
               10:         12:   qdisc
              /   \       /   \
           10:1  10:2   12:1  12:2   classes folha

Mas não deixe que esta árvore te engane. O kernel NÃO está no topo da árvore e a rede abaixo dele! Os pacotes entram e saem das filas pela qdisc raiz, que é a única que pode falar com o kernel.

Um pacote pode ser classificado numa corrente como a mostrada a seguir:

1: -> 1:1 -> 1:12 -> 12: -> 12:2

Agora o pacote está numa fila de uma qdisc associada à classe 12:2. Neste exemplo cada um dos 'nós' da árvore possui um filtro associado, cada um deles escolhendo a ramificação que deve ser seguida. Isto é muito lógico, mas a possibilidade a seguir também é válida:

1: -> 12:2

Neste caso, um filtro associado à raiz decidiu enviar o pacote diretamente para 12:2.

Como os pacotes saem da fila para ir para o hardware

Quando o kernel decide que precisa retirar pacotes para enviá-los para a interface, a qdisc raiz 1: recebe uma solicitação de liberação, a qual é passada para 1:1, que a passa para 10:, 11: e 12:. Estas, por sua vez, acionam seus irmãos e tentam conseguir a liberação. Neste caso, o kernel precisa atravessar a árvore inteira porque apenas a 12:2 contém um pacote.

Resumindo, classes aninhadas SOMENTE falam com suas qdiscs pai, nunca falam com uma interface. Apenas a qdisc raiz é tirada da fila pelo kernel!.

O resultado disto é que as classes nunca saem da fila mais depressa do que seus pais permitem, e é exatamente isto o que queremos: deste modo podemos ter uma SFQ numa classe interna, que não faz nenhuma modelagem, apenas controla o horário, e ter uma qdisc externa que faça a modelagem.

Informações adicionais