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) 


A qdisc PRIO

A qdisc PRIO não faz modelagem, apenas subdivide o tráfego de acordo com a configuração dos filtros. A qdisc PRIO pode ser considerada uma espécie de pfifo_fast vitaminada onde cada banda é uma classe separada ao invés de ser uma FIFO simples.

Quando um pacote entra numa fila qdisc PRIO, uma classe é escolhida de acordo com os comandos de filtragem dados. Por default, três classes são criadas. Estas classes, por default, contém qdiscs FIFO puras sem uma estrutura interna, mas é possível substituí-las por qualquer qdisc disponível.

Sempre que um pacote precisar sair da fila, a classe :1 é acionada primeiro. Classes mais altas são usadas apenas se todas as bandas mais baixas não devolverem um pacote.

Esta qdisc é muito útil quando se quer priorizar certos tipos de tráfego sem usar apenas flags TOS, mas usando todo o poder dos filtros tc. Também é possível adicionar outra qdisc às três classes predefinidas, se bem que a pfifo_fast está limitada a qdiscs fifo simples.

Como a PRIO não faz modelagem, vale o mesmo alerta dado para a SFQ: deve ser usada apenas se o link físico estiver realmente lotado ou insira-a numa qdisc com classe que faça modelagem. A segunda alternativa vale para praticamente todos os cable modems e dispositivos DSL.

Formalmente, a qdisc PRIO é um controlador de precedência com Conservação de Trabalho.

Parâmetros e uso da PRIO

Os seguintes parâmetros são reconhecidos pelo tc:

  • bands (bandas): O número de bandas que devem ser criadas. Na verdade, cada banda é uma classe. Se você mudar este número então também precisa alterar o priomap.
  • priomap (mapa de prioridades): Se não forem fornecidos filtros tc para classificar o tráfego, a qdisc PRIO verifica a prioridade TC_PRIO para decidir como deve fazer a fila do tráfego.
    Isto funciona do mesmo modo que para a pfifo_fast. Para maiores detalhes procure a pfifo_fast em Administração de Largura de Banda no Linux.

    As bandas são classes e são denominadas maior:1 a maior:3 por default. Se determinada qdisc PRIO é chamada de 12:, faça um tc filter traffic para 12:1 para aumentar a sua prioridade.

    Repetindo: a banda 0 vai para o número menor 1, a banda 1 para o número menor 2, etc.

    Exemplo de configuração

    Vamos criar a seguinte árvore:

    
               1:   qdisc raiz
              / | \ 
             /  |  \
            /   |   \
          1:1  1:2  1:3    classes
           |    |    |
          10:  20:  30:    qdiscs    qdiscs
          sfq  tbf  sfq
    banda  0    1    2
    

    A massa do tráfego irá para 30:, o tráfego interativo para 20: ou 10:.

    Linhas de comando:

    # tc qdisc add dev eth0 root handle 1: prio 
    ## Isto cria instantaneamente as classes 1:1, 1:2, 1:3
      
    # tc qdisc add dev eth0 parent 1:1 handle 10: sfq
    # tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
    # tc qdisc add dev eth0 parent 1:3 handle 30: sfq                                
    

    Agora vamos ver o que criamos:

    # tc -s qdisc ls dev eth0 
    qdisc sfq 30: quantum 1514b 
     Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 
    
     qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms 
     Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 
    
     qdisc sfq 10: quantum 1514b 
     Sent 132 bytes 2 pkts (dropped 0, overlimits 0) 
    
     qdisc prio 1: bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 174 bytes 3 pkts (dropped 0, overlimits 0) 
    

    Como você pode ver, a banda 0 já tem algum tráfego e um pacote foi enviado enquanto rodamos este comando!

    Agora vamos fazer uma transferência de dados em massa com uma ferramenta que define as flags TOS corretamente:

    # scp tc 
     O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.
     :./
    
     O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.
     's password: 
    tc                   100% |*****************************|   353 KB    00:00    
    # tc -s qdisc ls dev eth0
    qdisc sfq 30: quantum 1514b 
     Sent 384228 bytes 274 pkts (dropped 0, overlimits 0) 
    
     qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms 
     Sent 2640 bytes 20 pkts (dropped 0, overlimits 0) 
    
     qdisc sfq 10: quantum 1514b 
     Sent 2230 bytes 31 pkts (dropped 0, overlimits 0) 
    
     qdisc prio 1: bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 389140 bytes 326 pkts (dropped 0, overlimits 0) 
    

    Como pode ser visto, todo o tráfego foi para o manipulador 30:, a banda de prioridade mais baixa - justamente o que queríamos que acontecesse. Agora, para verificar se o tráfego interativo vai para bandas mais altas, vamos criá-lo:

    # tc -s qdisc ls dev eth0
    qdisc sfq 30: quantum 1514b 
     Sent 384228 bytes 274 pkts (dropped 0, overlimits 0) 
    
     qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms 
     Sent 2640 bytes 20 pkts (dropped 0, overlimits 0) 
    
     qdisc sfq 10: quantum 1514b 
     Sent 14926 bytes 193 pkts (dropped 0, overlimits 0) 
    
     qdisc prio 1: bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 401836 bytes 488 pkts (dropped 0, overlimits 0) 
    

    Funcionou! Todo o tráfego interativo foi para 10:, a qdisc com a prioridade mais alta. Nenhum tráfego foi enviado para a prioridade mais baixa que, anteriormente, recebeu toda scp.

Informações adicionais