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) 


O dispositivo de fila intermediário

O dispositivo de fila intermediária (intermediate queueing) não é uma qdisc, mas seu uso está intimamente ligado às qdiscs. No Linux, as qdiscs estão associadas a dispositivos de rede e, tudo o que for colocado na fila do dispositivo, entra antes na fila da qdisc. Devido a este conceito surgem duas limitações:

  1. A modelagem só é possível na egressão (saída) - existe uma qdisc de egressão, mas suas possibilidades são muito limitadas quando comparadas com qdiscs com classe.
  2. Uma qdisc só pode ver o tráfego de uma interface, ou seja, não se pode estabelecer limitações globais.

A IMQ existe para ajudar a resolver estas duas limitações. Resumindo, é possível colocar qualquer coisa que você escolher numa qdisc. Pacotes marcados são interceptados no netfilter NF_IP_PRE_ROUTING e nos ganchos NF_IP_POST_ROUTING para passar através da qdisc associada a um dispositivo imq. Um alvo iptables é usado para marcar os pacotes.

Isto possibilita fazer uma modelagem de egressão (saída) porque se pode marcar apenas os pacotes vindos de algum ponto e/ou tratar interfaces como classes para especificar os limites globais. Também é possível fazer uma porção de coisas como colocar apenas o tráfego http numa qdisc, uma nova solicitação de conexão numa qdisc, etc.

Exemplo de configuração

A primeira coisa que nos vem a cabeça é usar uma modelagem de egressão (saída) para assegurar uma largura de banda alta. Esta configuração é igual a de qualquer interface:

tc qdisc add dev imq0 root handle 1: htb default 20

tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k

tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit

tc qdisc add dev imq0 parent 1:10 handle 10: pfifo
tc qdisc add dev imq0 parent 1:20 handle 20: sfq

tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match \
		ip dst 10.0.0.230/32 flowid 1:10

Neste exemplo, a u32 é usada para a classificação. Outros classificadores devem funcionar como o esperado. Depois, o tráfego precisa ser selecionado e marcado para entrar na fila im10.

iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0

ip link set imq0 up

Os alvos iptables IMQ são válidos nas cadeias PREROUTING e POSTROUTING da tabela mangle. A sintaxe é

IMQ [ --todev n ]	n : number of imq device

Um alvo ip6tables também está disponível.

Observe que o tráfego não entra na fila quando o alvo é atingido - isto só acontece posteriormente. A localização exata da entrada do tráfego no dispositivo imq depende da direção do tráfego (entrada/saída). Estas localizações são os ganchos netfilter pre-definidos usados pelo iptables:

enum nf_ip_hook_priorities {
        NF_IP_PRI_FIRST = INT_MIN,
        NF_IP_PRI_CONNTRACK = -200,
        NF_IP_PRI_MANGLE = -150,
        NF_IP_PRI_NAT_DST = -100,
        NF_IP_PRI_FILTER = 0,
        NF_IP_PRI_NAT_SRC = 100,
        NF_IP_PRI_LAST = INT_MAX,
};

Para o tráfego de ingresso, o imq se registra com a prioridade NF_IP_PRI_MANGLE + 1, o que significa que os pacotes entram no dispositivo imq imediatamente depois que a cadeia mangle PREROUTING tiver passado.

Para a saída, a imq usa NF_IP_PRI_LAST, que respeita o fato de que pacotes descartados não vão ocupar largura de banda.

Os patches e alguma informação adicional pode ser encontrada no site da imq.

Informações adicionais