Informática Numaboa - Linux
Administração de Largura de Banda no Linux II
Dom 22 Abr 2007 18:09 |
- Detalhes
- Categoria: Como fazer configurações
- Atualização: Terça, 21 Abril 2009 18:20
- Autor: vovó Vicki
- Acessos: 10404
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:
- 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.
- 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.